以下代码:
static void Main(string[] args)
{
Console.WriteLine("0");
string h = Foo.X;
Console.WriteLine("2");
}
public static class Foo
{
public static string X = ((Func<string, string>)delegate(string g)
{
Console.WriteLine(g);
return (g);
})("_aaa");
static Foo()
{
Console.WriteLine("ctor");
}
}
将打印:
0
_aaa
ctor
2
我知道beforefieldinit
行为(有/没有静态构造函数等)。
我不理解的事情是<{1}}(在输出中) ctor
后
它没有任何意义,如果我想在构造函数中初始化变量怎么办?
问题
为什么_aaa
的初始化在X
?
答案 0 :(得分:18)
ctor
在字段初始值设定项之后的原因是因为它是指定的方式。从C#规范(重点是我的):
10.5.5.1静态字段初始化类的静态字段变量初始值设定项对应于一系列赋值 按照它们出现在课堂中的文本顺序执行 宣言。 如果类中存在静态构造函数(第10.12节), 静态字段初始化程序的执行紧接在之前发生 执行那个静态构造函数。否则,静态字段 初始化器在之前的实现相关时间执行 第一次使用该类的静态字段
如果要完全控制初始化顺序,请将其全部移到构造函数中。