如果我在 ASP.NET 2.0 中将此类定义为应用程序的一部分:
public class Foo
{
private static int _seed = 100;
private static object myLock = new object();
public Foo()
{
lock (myLock)
{
this.MyInt = _seed;
_seed++;
}
}
public int MyInt {get; set;}
}
(编辑:更新以考虑答案指出的线程安全问题)
该静态成员将如何表现?它会从 100 开始并为每个 session 单独递增,还是会为每次页面刷新单独递增,还是全局...?
注意:我问这个问题是因为我第一次在 ASP.NET 应用程序中使用类来建模数据,并且我已经发现 C# 的按引用性质似乎被 ViewState 序列化忽略,所以我想知道我还能期待什么其他奇怪的事情。例如,如果我定义了此类(假设 Bar
是另一个类):
public class OtherFoo
{
public List<Bar> Bars {get; set;}
}
我在我的页面上执行此操作:
OtherFoo _myFoo = new OtherFoo();
//Code here to instantiate the list member and add some instances of Bar
Bar b = _myFoo.Bars[0];
ViewState["myFoo"] = _myFoo; //Assume both are [Serializable]
ViewState["myBar"] = b;
当我在下一次回发时将它们从 ViewState 中取出时,b
和 _myFoo.Bars[0]
不再是同一个对象。
最佳答案
ASP.NET 并不神奇。它不会神奇地将 C# 编程语言(或任何其他语言)转变为能够感知 Web 开发( session 、请求等)的语言。
您的代码的行为完全与任何其他类型的应用程序中一样,此外它可以由多个线程同时调用(因此使用“++”不是安全)。
再说一次,没有什么魔法。就像所有其他应用程序一样,静态的生命周期仅限于加载包含静态的类型的 AppDomain 的生命周期。
ASP.NET 应用程序中的 AppDomain 是在第一次访问应用程序时创建的(除非 IIS 设置强制其预先启动),并且仅在特定时间结束,例如 bin
中的程序集时结束。文件夹已更改,或 web.config
发生更改,或者 IIS 设置表明 AppPool 需要回收时。
关于c# - ASP.NET 2.0 中的静态类变量行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431191/