【问题标题】:Static class variable behavior in ASP.NET 2.0?ASP.NET 2.0 中的静态类变量行为?
【发布时间】:2011-06-21 19:51:57
【问题描述】:

如果我在 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 应用程序中使用类来建模数据,而且我已经发现 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] 不再是同一个对象。

【问题讨论】:

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


    【解决方案1】:

    ASP.NET 并不神奇。它不会神奇地将 C# 编程语言(或任何其他语言)转变为能够感知 Web 开发(会话、请求等)的语言。

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


    再一次,没有魔法。就像所有其他应用程序一样,静态的生命周期仅限于加载包含静态的类型的 AppDomain 的生命周期。

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

    【讨论】:

    • 我不是故意的。我知道,如果这是在本地应用程序中,静态变量将在应用程序启动的整个生命周期内不断增加。我不确定的是“应用程序启动的生命周期”是否对应于一个会话(这是我所希望的......这个例子并没有说明我是如何使用这个概念的)。但也感谢您指出线程安全问题。
    【解决方案2】:

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

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

    请注意,C# 语言和 asp.net 框架完全不同。该框架(大部分)是用 C# 编写的,它会在幕后为您做很多事情,但它仍然遵循语言和运行时的规则。

    序列化只不过是将对象(或对象图)的信息编码到流中。如果您反序列化它,您将获得相同的信息,但它与您开始使用的对象不同。同样,这不是什么魔法,您可以使用属性和反射编写自己的序列化库。

    【讨论】:

    • 关键问题是:它会从 100 开始种子,然后在永恒中不断增加它,还是会在每次会话时重置为 100,或类似的东西?
    • 不,静态字段将在应用程序的生命周期内存在。请注意,您可以将 IIS 配置为在达到多个请求后或在某个时间间隔后重新启动应用程序。这当然会重置静态字段。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2010-10-25
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多