在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实 例才能操作这些数据,这起到了“信息隐藏”的作用。但有些时候,这样做却不是个明智的选择。
假设我们要定义一个图书类,要求该类能保存图书的数量,即每增加一本图书(定义一个实例), 图书的数量应该加1。如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)里,然而,这样的变量要在不同图书(实例)里重复存储,图书(实例) 数量少的话,我们还能接受,如果图书(实例)数量较多的话,比如成千上万,我们无法想象这要造成多少资源(如内存、磁盘空间)的浪费,更让人无法忍受的 是:因为图书(实例)的数量要保存在每本图书(实例)里,该值肯定是不同的。要使这些图书(实例)中保存的图书(实例)数量一致,我们必须在每增加一本新 书(生成一个新实例)时,修改其他所有图书(实例)中保存的该值。Oh,My God!你会重新向往面向过程的程序设计方法,向往拥有全局变量的时代。但,这种局面不会出现,因为C#中为你准备好了另外一种变量类型:静态变量。它在 类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。
声明静态变量的语法如下:
<访问修饰符>static 数据类型 变量名;
这里的访问修饰符跟类的其它成员一样,可以是public,protected,private或internal等。
在普通的成员变量前加static关键字,就变成了静态变量。静态变量和实例变量存储方式 不同,静态变量在声明开始,就一直存储在内存中,直到整个程序终止。而实例成员在创建对象时分配内存,并存储一个数据副本。所以静态成员变量认为是属于类 的,而不是对象。
静态变量与实例变量的区别如下:
1.内存分配
静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
而实例变量需要被实 例化后才会分配内存。
2.生存周期
静态变量生存周期为应用程序的存在周期;
实例变量的存在周期取决于实例化的类的存在周 期。
3.调用方式
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
实例变量当该变量所在的类被实例化后,可通 过实例化的类名直接访问。
4.共享方式
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实 例读到的就是变化后的值;
实例变量是局部变量,不共享的。
5.访问方式
静态成员不能访问实例成员;
实例成员可以 访问静态成员。
静态变量在类装载的时候分配内存, 以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作。也可以看作是另类的全局变量。
所以:静态变量只的值只会初始化一次,后面每次访问,都是上次处理过的值,(即使是在一个函 数内部)。 实例变量每次都初始化。
静态变量必须使用类名来引用,而不 能使用类的实例,因为,静态变量不属于任何实例,而是共有的。我们可以打个比方:在一个班级中,有些物品是个人的,我们想使用时,必须指出物品的所有者, 比如说“王三的自行车”,在C#程序中我们可以使用:王三.自行车的格式。有些物品是大家共有的物品,不能以个人名义使用,而是用班级的名义使用,比如班 集体出资买的篮球,只能说:“班级的篮球”,而不能说:“王三的篮球”。这绝对是不行的,这对其他人绝对是不公平的,我们可以联想到许多贪官污吏就是使用 了不属于自己的东西,或以个人名义使用公家的东西而葬送了自己。 说一句有用的就是:静态变量是用类名来引用它。即:类名.静态变量名; 举个具体的例子如下:
事情起因是今天 有人发现景区评级评论 对世博园的评论跑到大学城了 对大学城的评论跑到世博园了.... 查看代码插入缓存的id也是插入数据库那条数据id 赋值给一个变量..要出现这种情况,除非是赋值后 原id被改变了..... 打开大学城这个页面 不做评论提交 后来经查看代码发现,记录id的变量不知啥时候成了静态变量,后来从网上抄了份资料没看就堆到上面了.小记
然而实时缓存里的数据是正确的 ,查数据库,法相数据库存的数据确实倒了过来...灵异事件?
思索...思索..1,提交评论是先插入数据库然后再刷新缓存,缓存刷对了 数据库却存的不对 不应该啊?
2.还原现场
在用另一个浏览器打开世博园页面 不做评论提交
大学城页面评论并提交,然后世博园评论并提交
结果大学城存入了世博园 世博园存入了大学城3.分析
静态变量不能作为实例生命周期的变量,实例销毁了 他依然坚挺..说以出现了上面的情况
首先打开大学城的页面 变量是大学城的id ,又有人打开世博园的页面 id又被刷新成了世博园id
这时候大学城提交评论 插入到了世博园 提交后页面刷新 id又被刷成了大学城
这时世博园提交 评论就到了大学城...
然后悲剧了....

615

被折叠的 条评论
为什么被折叠?



