静态只读字段的初始化顺序

zix*_*x99 4 c# static

我很好奇C#规范说明了在C#5(.net4)中初始化静态字段的顺序.例如:

public class Test
{
   public static readonly string A = "hi";
   public static readonly string B = "bye";
   public static readonly string DEFAULT = A;
}
Run Code Online (Sandbox Code Playgroud)

在测试(Mono 2.x)中,它们似乎按照它们在代码中出现的顺序进行初始化.例如.由于是,DEFAULT将有值"喜",但如果我移动定义为DEFAULT上述A和B,它会被分配NULL,因为一个尚未分配.

是否保证变量按顺序初始化?还是由编译器决定?

谢谢.

Mar*_* N. 7

它按照它们出现的顺序排列.请参见此处.

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.

此外,当你有一个静态构造函数时:

如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行.