簡體   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