スタックオーバーフロー。非静的クラスの変数を初期化するとします。そのうちの2つはUserID(int)とMyDictionary(Dictionary)です。この非静的クラスは、静的クラス内で宣言されます(そして、静的クラスのメンバーの1つで初期化されます)。スクリプトが長時間実行され、別のユーザーが同じページにアクセスした場合、新しいユーザーが他のユーザーのMyDictionaryのコンテンツを変更する可能性があります。しかし、MyDictionaryは非静的クラスであるため、これがどのように可能かわかりません。誰かがこれを理解していますか?ありがとうございました。
3 に答える
静的性(またはその欠如)は、スレッドの安全性に影響を与えません。静的とは、クラスメンバー(プロパティ、フィールド、メソッド、またはコンストラクター)が、クラスの特定のインスタンスではなく、型に関連付けられていることを意味します。
スレッドセーフではない静的コード(質問で説明したコードなど)を記述したり、スレッドセーフなインスタンスコードを記述したりできます。その逆も可能です。これは、スレッドセーフではない(悪い)コードです。多かれ少なかれ、あなたがしていると思うことに沿っています。
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>();
}
}
ユーザー固有の情報をASP.NETに保存する必要がある場合は、Sessionオブジェクトまたは(より長期間有効なデータの場合は)データベースを使用します。静的変数に依存しないでください。2人のユーザーが同時にサイトにいる場合はどうなりますか?
だから私はコードがこのように少し見えると思いますか?
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);
}
}
静的クラス内のオブジェクトを静的変数として宣言することにより、基本的に「私のアプリケーションでは、これらの1つが必要です。これらの1つだけが必要です」と言っています。したがって、クラスは静的ではありませんが、あなたはまだそれの静的インスタンスを作成しています。
包含クラスとアクセスメンバーは静的であるため、単一のメモリスペースを使用します。静的クラスの参照(この場合はローカル、フィールド、またはプロパティ)も静的であると想定する必要があります(非静的クラスのインスタンス化であっても)。
そもそもクラスが静的である理由は何ですか?共有ロジックを使用している場合は、静的メソッドを参照してディクショナリを渡してみませんか?