繁体   English   中英

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

[英]Static class variable behavior in ASP.NET 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开始并为每个会话单独增加,还是为每个页面刷新分别增加,还是全局...?

注意:之所以这样问是因为我第一次在ASP.NET应用程序中使用类对数据进行建模,并且我已经发现ViewState序列化似乎忽略了C#的按引用性质,所以我想知道我还能期待什么其他怪异的事物。 例如,如果我定义了此类(假设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;

当我在下一次回发_myFoo.Bars[0]它们从ViewState中_myFoo.Bars[0]b_myFoo.Bars[0]不再是同一对象。

ASP.NET不是魔术。 它不会神奇地将C#编程语言(或任何其他语言)转换为可感知Web开发(会话,请求等)的语言。

您的代码的行为将与任何其他类型的应用程序完全相同 ,此外,它可以被多个线程同时调用(因此使用“ ++”是不安全的)。


再次,没有魔术。 就像其他所有应用程序一样,静态变量的生存期仅限于其中加载了包含静态类型的AppDomain的生存期。

在ASP.NET应用程序中的AppDomain是在首次访问该应用程序时创建的(除非IIS设置强制其预先启动),并且仅在特定时间结束(例如,更改bin文件夹中的程序集或更改了web.config ,或者当IIS设置说需要回收AppPool时。

每次调用构造函数时,它将增加种子。 请注意,这可能在多个线程中发生,因此最好使它成为线程安全的。

反序列化将导致(默认)构造函数被调用。 如果将其序列化为ViewState,则ASP.NET将在回发时反序列化对象,从而调用构造函数。

请注意,C#语言和asp.net框架在另一个层次上。 该框架(大部分)是用C#编写的,它将在幕后为您做很多事情,但是仍然遵循语言和运行时的规则。

序列化不过是将对象(或对象图)的信息编码为流而已。 如果对它进行反序列化,则将获得相同的信息,但是它与开始时使用的对象不同。 再次,这不是魔术,您可以使用属性和反射来编写自己的序列化库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM