ASP.NET:所有实例共享⼀个static变量
在C#中,static变量表⽰该变量属于类,⽽不是类的实例。可以说是该类的所有实例共享⼀个static变量。
asp的页⾯就是⼀个类,我们访问⼀个页⾯。就会在服务器上实例化⼀个该类的实例,来响应我们的请求。“所有实例共享⼀个static变量”这就意味着,所有的客户端访问到的asp页⾯中static变量都是同⼀个变量。
由于我们每次访问asp页⾯都是⼀个全新的对象,⽽不是我们上⼀次访问的对象。所以上次页⾯访问时我们对页⾯中变量的改动都没有保留。遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,⾃⼰在测试的时候发现还真的保留住了页⾯的状态。窃喜之余没有发现这⼜有引⼊了另外⼀个错误。因为你要的只是页⾯能保留住状态,⽽这个状态是针对⼀个客户端的(session的效果)。⽽得到的结果是只要⼀个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果)。这种情况下,需要的极有可能就是个ViewState或者是Session。
Application与static变量
Application是通过⼀个集合保存所有的对象。
session和application的区别
强类型:Application中保存的是object,对对象的保存和使⽤需要作cast动作。对于值类型更需要Box&UnBox。对性能的影响较⼤。⽽static变量是强类型的对象。
线程同步:Application将所有的对象放到⼀个集合,这样对访问集合中的任何对象都会锁定这个集合。假如有Application["A"]、Application["B"]、Application["C"],有线程访问Application["A"]其他线程不能访问Application["B"] and Application["C"]。
⽽static变量,可以根据他们的作⽤分别放在不同的class当中。这样可以并⾏访问不同的static变量,⽽不存在线程安全问题。
友情提⽰:
1. 对static变量,做lock时。可以通过lock(typeof(classname))来锁定该变量所在的类的类型,达到线程同步的⽬的。
2. 由于Aplication,static member是全局变量,⽽我们是在多线程服务器环境写程序,对他们的使⽤需要注意线程安全的问题。
asp和C++中的static并没有多少不同,实质上他们都是在编译期就已存在的地址空间。换句话说,在你Build成功之后,项⽬的DLL⽂件中已经存在了这个static变量(或者类)的空间,亦即在你运⾏时
系统载⼊DLL后这个变量/类的所谓实例已经存在,⽽且是应⽤程序所公⽤,所以你才可以直接使⽤,同时所有的页⾯⽤的都是同⼀块空间。
普通的类你需要new⼀个instance才可以使⽤,原因就在于应⽤程序中间只有声明⽽没有定义,new的时候就在堆⾥划分⼀块空间给他的⼀个实例。
⼀个简单的实验,⼤家就很容易的明⽩他们之间的区别:新建个简单的project,添加⼀个类,类增加⼀个变量,编译,记录dll⽂件的⼤⼩;然后把变量变成static变量(当然你的class也必须成为static的了,想想这是为什么),编译,记录dll⽂件⼤⼩;⽐较两个dll⼤⼩,是不是后⾯⼀个⽐前⾯⼤呢?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论