何时是";常数";类变量已初始化

本文关键字:quot 初始化 类变量 何时 常数 | 更新日期: 2023-09-27 18:03:15

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

我的类定义如下:

public class ABC : XYZ
{
    private const int constantNumber = 600;
    public ABC(): base(constantNumber)
    {}
}

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

它究竟是什么时候定义的?

何时是";常数";类变量已初始化

即使没有初始化类,它也可用!基本上,无论在哪里使用常量,编译器都会内联该值。

例如:

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字段的情况,其值在执行时检索,而不是在编译时嵌入。

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

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

正如MarkO所指出的,当在程序集B中使用来自a的常量时,来自a的值将直接编译到B中。因此,如果您更新并重新部署了值更改的a,B将不会反映它。