何时“常量”类变量初始化

时间:2015-07-17 08:42:20

标签: c# .net

我有一个定义为类变量的常量int变量:

我的课程定义如下:

public class ABC : XYZ
{
    private const int constantNumber = 600;

    public ABC(): base(constantNumber)
    {}

}

它在调用基础构造函数时(即在调用它自己的构造函数之前)是否可用?

什么时候定义?

2 个答案:

答案 0 :(得分:9)

即使没有初始化课程,它仍然可用!基本上,在使用常量的任何地方,编译器都会内联值。

例如:

public class Constants
{
    public const int Foo = 10;

    static Constants()
    {
        Console.WriteLine("Constants is being initialized");
    }
}

class Program
{
    static void Main()
    {
        // This won't provoke "Constants is being initialized"
        Console.WriteLine(Constants.Foo);
        // The IL will be exactly equivalent to:
        // Console.WriteLine(10);
    }
}

即使使用static readonly变量,您仍然可以在当前正在使用它的地方使用它 - 因为它与类型相关而不是与类型。不要忘记const隐含static(并且您无法明确说明)。

作为旁注(在评论中提到)这个"嵌入"意味着您只应将const用于真正 常量的事物。如果上面的ConstantsProgram位于不同的程序集中,并且Constant.Foo已更改为值为20,那么在更改可用之前需要重新编译Program不具有static readonly字段的情况,其值在执行时检索,而不是在编译时嵌入。

(这也会影响可选参数的默认值。)

答案 1 :(得分:4)

在编译时,它会直接编译到生成的DLL中,因此在程序开始运行之前就可以使用了。

正如MarkO所指出的,当A中的汇编B中使用常量时,A中的值直接编译为B.因此,如果更新并重新部署A值,则B不会反映它。