静的イニシャライザはスレッドセーフだと誰もが言いますが、私は特定の詳細について心配しています。
私が持っているとしましょう
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
MyStaticClass.myField
がまだ初期化されていない場合、C# が保証するのは次のうちどれですか?
myField
スレッド 1 と 2 が一緒に (この順序で)アクセスしようとすると、スレッド 2 が読み取る前に実行GetNewObject
が開始さmyField
れます。myField
スレッド 1 と 2 が一緒に (この順序で)アクセスしようとすると、スレッド 2 が読み取る前に実行GetNewObject
が終了しmyField
ます。
一般的に CLR はどうですか? その保証が C# のものと異なる場合、それらはどのように異なるのでしょうか?
最近のバージョンの .NET Framework で動作が変更されましたか?
ノート:
これは難しい質問であり、完全な回答はおそらく静的コンストラクターと静的初期化子の違い、およびそれらがどのように相互作用しbeforefieldinit
て要求された結果を生成するかについて言及すると思います。