c# - ASP.NET 2.0 中的静态类变量行为?

标签 c# asp.net oop c#-2.0

如果我在 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/

相关文章:

c# - String 是引用类型,但是当我们将它作为参数传递给函数时,它作为值类型工作,为什么?

c# - 使用图像将 Gridview 导出到 Excel

c# - IClientChannel 反模式

php - 在抽象类中声明的方法中从子项中获取常量覆盖

c++ - 软件设计 : Too many classes?

c# - ThrowTerminatingError 在 C# 中如何工作?

c# - 函数中绝对数的总和

asp.net - ASP.NET 应用程序可以处理 NServiceBus 事件吗?

asp.net - Web.config 加密错误

java - 如何回滚除异常之外的所有内容以存储在表中