【问题标题】:Why static fields initialization occurs before the static constructor?为什么静态字段初始化发生在静态构造函数之前?
【发布时间】:2012-01-07 06:46:05
【问题描述】:

以下代码:

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之前?

【问题讨论】:

  • 对于非静态字段和非静态构造函数是类似的,当然:class Foo { public string X = "A"; public Foo() { X = "B"; } } 这样,如果你这样做(new Foo()).X,你得到"B",而不是"A",因为"B" 的分配最后发生(覆盖了第一个值)。
  • @JeppeStigNielsen 感谢您的澄清

标签: c# .net static


【解决方案1】:

ctor 在字段初始值设定项之后的原因是因为它是这样指定的。来自 C# 规范(重点是我的):

10.5.5.1 静态字段初始化 类的静态字段变量初始化器对应于一系列赋值 以它们在类中出现的文本顺序执行 宣言。 如果类中存在静态构造函数(第 10.12 节), 静态字段初始化器的执行发生在紧接之前 执行该静态构造函数。否则,静态字段 初始化器在依赖于实现的时间执行 首次使用该类的静态字段

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

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多