我准备了一个非常简单的网站来证明这种行为。
它有一个页面,其中包含一个Button和以下代码:
public partial class TestStatic : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Class1.SetValue();
Label1.Text = Class1.st.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = Class1.st.ToString();
}
}
和一个班级:
public class Class1
{
public Class1()
{
}
public static int st = 0;
public static void SetValue()
{
st = 1;
}
}
因此,当页面加载时,您会在Label1中看到st = 1。如果用户点击Buttton,有时你可以看到st = 0,有时st = 1。在调试中我看到有时命令
public static int st = 0;
当用户点击Button时执行,这就是st变为零的原因。我只能在框架4.5中重现这种行为:它不会出现在框架3.5中。有人可以解释一下这种行为吗?
答案 0 :(得分:5)
每个应用程序域实例的静态数据存在。由于托管(IIS)可以在网站调用之间卸载应用程序域,因此静态数据可能会丢失。
所以,你真的不应该依赖网络应用中的静态。
答案 1 :(得分:3)
静态值在单个App Domain内的所有类实例之间共享。 如果您使用的是IIS Express,您的应用域可能会比您想象的更频繁地回收。