2011-11-27 45 views
11

下面的代码:为什么静态字段初始化发生在静态构造函数之前?

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行为(有/无静态构造函数等)。

明白的事情是为什么ctor(输出)是_aaa后?

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

问题

为什么的X初始化是ctor过吗?

+0

当然,非静态字段和非静态构造函数类似:class Foo {public string X =“A”; public Foo(){X =“B”; }}'如果你做了'(new Foo())。X',你得到''B'',而不是''A'',因为''B''的赋值最后发生了(覆盖了第一个值)。 –

+0

@JeppeStigNielsen感谢您的澄清 –

回答

17

原因ctor是字段初始值设定项之后的原因,因为这是它指定的方式。从C#规范(重点是矿):

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

如果您希望您的初始化顺序的总量控制,将它全部在构造函数中。

+0

非常感谢... –

相关问题