簡體   English   中英

ASP.NET中的靜態C#類變量是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM