为什么静态字段初始化发生在静态构造函数之前?

Roy*_*mir 12 .net c# static

以下代码:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

将打印:

0
_aaa
ctor
2
Run Code Online (Sandbox Code Playgroud)

我知道beforefieldinit行为(有/没有静态构造函数等).

我不明白的是为什么ctor(在输出中)之后 _aaa?

它没有任何意义,如果我想在构造函数中初始化变量怎么办?

题

为什么初始化X是在ctor?之前?

Joã*_*elo 18

原因ctor是在字段初始化程序之后是因为它是指定的方式.从C#规范(重点是我的):

10.5.5.1静态字段初始化类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行

如果要完全控制初始化顺序,请将其全部移到构造函数中.