3

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;
        }
    }
}

誰かが私のために平易な英語で説明できますか?

4

3 に答える 3

5

私はどこかで読んだことがあります。

静的変数/フィールドは、それを含む型の静的コンストラクターが実行される前に存在し、関連付けられたアプリケーションドメインが存在しなくなると存在しなくなります。

于 2012-07-02T06:37:08.513 に答える
1

マルチスレッド ASP.NET アプリケーションのコンテキストでこの質問をしているので、細心の注意を払う必要があります。次のシナリオをチェックアウトします。

2 人のユーザー Bob と Alice が、getID異なる引数を渡してまったく同時にメソッドを呼び出します。Bob がパスFooし、Alice がパスしBarます。これは最初の呼び出しであるため、_cachedID変数はまだ初期化されていないため、両方ともif条件に入ります。Bob はわずかに遅れます。したがって、アリスはthe _cachedID静的変数をに設定Barし、マイクロ秒後に にBob設定しFooます。コードは続行され、関数はFoo両方のユーザーに戻ります。もちろん、ボブはそれが彼の望みだったので喜んでいますが、アリスはそれを望んでいましたBar

たとえば、マルチスレッド環境で 1 回限りの初期化を実行する場合は、シングルトン パターンのスレッド セーフ バージョンの使用を検討できます。

これの教訓は、ASP.NET アプリケーションで共有/静的データを扱うときは細心の注意を払う必要があるということです。それを使用する必要がある場合は、アクセスを適切に同期する必要があります。そうしないと、非常に悪いことが起こる可能性があります。また、アプリケーションが複数のユーザーによって同時にアクセスされる場合、通常は本番環境で発生します。ローカル PC ではすべて正常に動作します。

そして、静的フィールドの有効期間に関する元の質問に戻ります。それは、アプリケーション ドメインの有効期間に関連付けられています。

于 2012-07-02T06:49:01.000 に答える
0

オブジェクトを作成することはできず、作成する必要もないが、静的コンテキストからのみアクセスできるクラス。

次のように例を使用します。

MyFunctions.getID("bla");

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2012-07-02T06:39:20.950 に答える