どのように読み取り専用の静的フィールドはnullにすることができますか?
-
19-09-2019 - |
質問
だからここに私のクラスの1からの抜粋です
[ThreadStatic]
readonly static private AccountManager _instance = new AccountManager();
private AccountManager()
{
}
static public AccountManager Instance
{
get { return _instance; }
}
あなたが見ることができるように、それはシングルトン・スレッドごとのだ - つまりインスタンスがThreadStatic属性でマークされています。インスタンスは、静的構成の一部としてインスタンス化されます。
の場合であること、それはどのように私はインスタンスのプロパティを使用しようとすると、私は私のASP.NET MVCアプリケーション内とNullReferenceExceptionを取得していた可能性ありますか?
だから解決
引用 MSDN ThreadStaticAttributeするます:
の初期値を指定しないでください でマークされたフィールド ThreadStaticAttribute、こうした理由 初期化は一度だけ、ときに発生します クラスのコンストラクタが実行され、 したがって、一つのスレッドだけに影響します。もし あなたは初期値を指定しないでください、 あなたがいるフィールドに頼ることができます それならば、そのデフォルト値に初期化 値型であるか、またはNULLに 参照(Visual BasicではNothing)の場合 それが参照型である。
他のヒント
このはThreadStatic
属性の混乱一部です。それは、スレッドごとに値を作成していても、initalizationコードはスレッドだけの1で実行されます。この値にアクセスする他のスレッドのすべては、その型のデフォルトの代わりに、初期化コードの結果を取得します。
の代わりに値の初期化を、あなたのための初期化を行いプロパティでそれをラップします。
[ThreadStatic]
readonly static private AccountManager _instance;
private AccountManager()
{
}
static public AccountManager Instance
{
get
{
if ( _instance == null ) _instance = new AccountManager();
return _instance;
}
}
値_instance
がスレッドごとに一意であるため、、全くロックプロパティに必要ではなく、それは他のどの遅延初期化値と同様に処理することができます。
あなたがここに古典[ThreadStatic]
"101" がヒットしました。
静的初期化子だけ火が一度意志、ののそう他のスレッド(離れて最初から)は、この初期化されていないが表示されます、[ThreadStatic]
としてマークされていても。
私は何が起こっていることは、別のスレッドが_INSTANCEが再び初期化することができないので、それが(そのデフォルト値以降)nullになりますフィールドを読み取ろうとする際に、静的フィールドは、一度だけので、初期化されていることであると信じています。そのわずかな思考が、私は完全に道オフにすることができるが、それは私が起こっていると思うものです。
ThreadStaticAttributeでマークされた静的フィールドは、スレッド間で共有されていません。各実行スレッドは、フィールドの別々のインスタンスを有し、かつ独立して設定し、そのフィールドの値を取得します。フィールドが別のスレッドにアクセスした場合、それは別の値が含まれます。