private static int i;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
i = i + 1;
Label1.Text =i.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{ }
现象1. 第一次运行是Label1.Text为1,每次刷新自动加1。点击Button1 在刷新Label1.Text值不变
现象2. 第一次运行是Label1.Text为1,关闭运行或IE。在运行程序Label1.Text为2,再关闭、运行都自动加1
为什么呢,郁闷。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
i = i + 1;
Label1.Text =i.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{ }
现象1. 第一次运行是Label1.Text为1,每次刷新自动加1。点击Button1 在刷新Label1.Text值不变
现象2. 第一次运行是Label1.Text为1,关闭运行或IE。在运行程序Label1.Text为2,再关闭、运行都自动加1
为什么呢,郁闷。
{
i = i + 1;
Label1.Text =i.ToString();
}
仅第一次load的时候
if (!Page.IsPostBack)
{
}
i = i + 1;
Label1.Text =i.ToString();
只在首次加载的时候执行
i = i + 1;
Label1.Text =i.ToString();
,但是你刷新之后,页面是重新打开,也就是第一次打开,所以要执行里面的代码。
还有你说关闭之后再打开,其实跟你按F5一样,都是重新打开,那个静态变量在服务器端,所以每次访问都会加1。
有点类似于application,所以一般在b/s的程序中不要用静态变量
不过,实际上在生产服务器上iis和asp.net经常会让你的应用程序重新启动,因此实际上生产环境下i可能随时被重新初始化(类似地,Session、Application集合内容会随时“丢失”),这是你在自己的单机上调试时容易忽视的,写出的程序很可能有这类没有考虑到此问题的bug。你可以试一试,调试时随时停止一下web服务器(对于iis需要再次启动),再继续在页面上按button,就可以看到数据被初始化了。
在C#中,static变量表示该变量属于类,而不是类的实例。可以说是该类的所有实例共享一个static变量。
asp.net的页面就是一个类,我们访问一个页面。就会在服务器上实例化一个该类的实例,来响应我们的请求。“所有实例共享一个static变量” 这就意味着,所有的客户端访问到的asp.net页面中static变量都是同一个变量。由于我们每次访问asp.net页面都是一个全新的对象,而不是我们上一次访问的对象。所以上次页面访问时我们对页面中变量的改动都没有保留。遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,自己在测试的时候发现还真的保留住了页面的状态。窃喜之余没有发现这又有引入了另外一个错误。因为你要的只是页面能保留住状态,而这个状态是针对一个客户端的(session的效果)。而得到的结果是只要一个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果)。这种情况下,需要的极有可能就是个ViewState或者是Session。Application与static变量
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是全局变量,而我们是在多线程服务器环境写程序,对他们的使用需要注意线程安全的问题。
他是不保存状态的
可以用 viewdata
如果你真想知道为什么呢 ?
你要去找“网页事件发生的顺序”和执行的任务...
{
i = i + 1;
Label1.Text =i.ToString(); }
改为 i = i + 1;
Label1.Text =i.ToString();