【问题标题】:C# - when at runtime is a const field initializedC# - 在运行时初始化 const 字段
【发布时间】:2014-10-25 18:31:52
【问题描述】:

由于某种原因,我未能找到这方面的文档。 看起来,在 C# 中,类的 const 字段在静态字段之前初始化,从这段代码可以看出:

class Program {
    static int p = f;
    const int f = 10;

    static void Main(string[] args){
        System.Console.WriteLine("{0}", p);
        System.Console.ReadLine();
    }
}

(这个输出10,而如果我用static替换const,它输出0)。

问题是: 这种行为是否总是如此? 还有,一般来说,不同种类的静态类字段的初始化顺序是什么?

【问题讨论】:

  • const 是编译时值。静态变量在运行时按照它们声明的顺序初始化...

标签: c# class static field constants


【解决方案1】:

常量根本没有初始化,它们是在编译时被替换的常量值。代码运行时,就好像原来是这样的:

static int p = 10;

这种编译时替换的副作用是,存在于一个程序集中并在不同程序集中使用的常量需要在更改常量时重新编译两个程序集。

【讨论】:

  • 谢谢,我在字段的上下文中理解它有些困难。
【解决方案2】:

const 声明了一个在编译 时确定的值。在编译后的代码中,它只是作为文字出现,而不是对某个命名标识符的引用。所以,是的……const 成员总是在任何其他成员之前“初始化”,因为它们根本就被“初始化”了。

这是对您的更广泛问题的相当完整的答案:What is the static variable initialization order in C#?

这里有几个文档链接也应该有所帮助:

10.4.5.1 Static field initialization

10.4.5.2 Instance field initialization

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2012-06-08
    • 2011-09-26
    相关资源
    最近更新 更多