每个人都说静态初始化器是线程安全的,但我担心一个特定的细节。
假设我有
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
C# 保证以下哪一项MyStaticClass.myField
尚未初始化?
如果线程 1 和 2 尝试一起访问
myField
(按该顺序),GetNewObject
将在线程 2 读取之前开始myField
执行。如果线程 1 和 2 尝试一起访问
myField
(按该顺序),GetNewObject
将在线程 2 读取之前完成myField
执行。
一般来说,CLR 怎么样:如果它的保证与 C# 的不同,那么它们在哪些方面不同?
.NET 框架的最新版本中的行为是否发生了变化?
笔记:
这是一个棘手的问题,我认为完整的答案可能会提到 static constructor和 static initializer之间的区别,以及它们如何交互beforefieldinit
以产生声称的结果。