[英]What are static C# class variables for in ASP.NET?
我知道靜態類變量在C ++類中做了什么,我不太清楚的是用於ASP.NET Web應用程序的C#類中的靜態類變量的生命周期。 這是一個代碼示例:
namespace MyWebApp
{
public static class MyFunctions
{
private static string _cachedID;
public static string getID(string strValue)
{
if(_cachedID == null)
_cachedID = strValue;
return _cachedID;
}
}
}
有人可以用簡單的英語為我解釋一下嗎?
我在某處讀過。
靜態變量/字段在執行其包含類型的靜態構造函數之前就已存在,並且在關聯的應用程序域不再存在時不再存在。
由於您在多線程ASP.NET應用程序的上下文中提出此問題,因此您應該非常小心。 簽出以下場景:
2個用戶Bob和Alice在傳遞不同參數的同時調用getID
方法。 Bob通過Foo
,Alice通過了Bar
。 由於這是第一次調用, _cachedID
變量尚未初始化,因此兩者都進入if
條件,Bob稍有延遲。 所以Alice將the _cachedID
靜態變量設置為Bar
然后將其設置為微秒, Bob
將其設置為Foo
。 現在代碼繼續,函數返回兩個用戶的Foo
。 鮑勃當然很高興,因為那是他想要的,但愛麗絲想要Bar
。
例如,如果要在多線程環境中執行一次初始化,可以考慮使用Singleton Pattern的線程安全版本。
這樣做的道理是,在ASP.NET應用程序中處理共享/靜態數據時應該非常小心。 如果您需要使用它,您需要正確地同步對它的訪問,否則可能會發生非常糟糕的事情。 當您的應用程序被多個用戶同時訪問時,它們通常會在生產中發生。 在您的本地PC上一切正常。
回到關於靜態字段生命周期的原始問題:它與應用程序域的生命周期相關聯。
您不能也不必創建對象的類,但您只能從靜態上下文訪問它。
你會像這樣使用你的例子:
MyFunctions.getID("bla");
http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.