何时"常量"类变量初始化

tav*_*ier 3 .net c#

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

我的课程定义如下:

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

    public ABC(): base(constantNumber)
    {}

}
Run Code Online (Sandbox Code Playgroud)

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

什么时候定义?

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

即使使用static readonly变量,您仍然可以在当前使用它的地方使用它 - 因为它与类型相关而不是类型的实例.不要忘记这const是隐含的static(你不能明确说明).

作为一个方面说明(注释中提到的),这种"嵌入"意味着你应该只使用const的东西这确实常数.如果ConstantsProgram上述均不同的组件,并且Constant.Foo被改变为具有值20,那么Program将需要重新编译前的变化将是可用的.这是不具有的情况下static readonly字段,其值在执行时被检索,而不是被嵌入在编译时.

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

  • 当常量用于不同的组件时,这是一种风险.如果更改常量,则可能无法重新编译使用组件. (2认同)