2012-04-10 10 views
0

スタックオーバーフロー。変数の非静的クラスを初期化したいとしましょう。そのうちの2つはUserID(int)とMyDictionary(Dictionary)です。この非静的クラスは、静的クラス内で宣言されています(静的クラスのメンバーの1つで初期化されています)。 スクリプトが長く実行され、別のユーザーが同じページにアクセスすると、新しいユーザーが他のユーザーのMyDictionaryの内容を変更する可能性があります。しかし、MyDictionaryは非静的なクラスのため、これがどのように可能であるかわかりません。誰もがこれを理解していますか?ありがとうございました。スタティッククラスのスレッドセーフティのASP.NET非静的クラス

+0

どこから他のユーザーが使用しているサーバーサイドのものを変更できるのでしょうか?私が間違っていなければ、サーバはすべてのユーザのために別々のスレッドとメモリを作ります。また、プライベートクラスが1クラスのみで使用されている場合を除いて、すべてのクラスを別々のファイルに入れることをお勧めします。 – MarioDS

答えて

1

だから私はこのコードがちょっとこのように見えると思っていますか?あなたは基本的に言っている静的変数と静的クラス内のオブジェクトを宣言することで

public class MyNonStaticClass 
{ 
    public int UserID; 

    public Dictionary<int, string> MyDictionary 
     = new Dictionary<int, string>; 
} 

public static class MyStaticClass 
{ 
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
     = new MyNonStaticClass(); 

    public static void AddToDictionary(int key, string value) 
    { 
     aStaticInstanceOfTheNonStaticClass.add(key, value); 
    } 
} 

「私のアプリケーションでは、私はこれらのいずれかをしたい、とこれらの一つだけ」。クラスが静的ではないにもかかわらず。それでも静的インスタンスを作成しています。

+0

男、私は約1時間これを考え出し、あなたの答えはそれを確認します。ありがとうございました。 – user1325179

0

格納するクラスとアクセスするメンバーは静的であるため、単一メモリ空間が使用されます。静的クラスの参照(この場合はローカル、フィールドまたはプロパティ)も静的であると仮定する必要があります(静的でないクラスのインスタンス化であっても)。

クラスが最初に静的である理由は何ですか?共有ロジックを使用している場合は、静的メソッドへの参照によってディクショナリを渡すのはなぜですか?

1

は、スレッドの安全性に影響しません。静的とは、クラスのメンバー(プロパティ、フィールド、メソッド、またはコンストラクタ)がタイプに関連付けられ、という特定のインスタンスではないことを意味します。

スレッドセーフではない静的コード(あなたの質問に記述するコードのような)を書くことができ、スレッドセーフであるインスタンスコードを書くことができます。逆も同様です。あなたはASP.NETで、ユーザー固有の情報を格納する必要がある場合

public static class MyFoo { 

    // Just because this is a static property doesn't 
    // mean the contained dictionary is thread safe! 
    public static Dictionary<String, String> MyDictionary { get; set; } 

    public static MyFoo() { 
     MyDictionary = new Dictionary<String, String>(); 
    } 
} 

を使用します。ここでは、多かれ少なかれ、私はあなたがやっていると思う何の線に沿って非スレッドセーフ(悪い)コード、いくつかのですセッションオブジェクトまたは(より長寿命のデータの場合)データベース。静的変数に依存しないでください。同時に2人のユーザーが同時にサイトにいる場合はどうなりますか?

関連する問題