为什么即使没有类的实例,成员常量也可用?

flo*_*ode 1 c#

1)为什么即使没有类的实例,成员常量也可用?

2)由于编译器用文字值替换常量变量,是否需要在编译时完全评估常量表达式的唯一原因?

3)由于字符串也是一个对象,我认为以下会产生错误,但事实并非如此.为什么?

class A
{
    const string b = “it works”; 
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*eet 7

  1. 常量(声明为const)是隐式静态的 - 因此不需要实例.

  2. 一个const值是嵌入在它的声明中装配,然后每它的时间使用,该值将被复制到调用代码.因此,无法在执行时对其进行评估 - 如果您想要该行为,请使用static readonly.

  3. 字符串文字是根据C#语言规范的常量值.基本上,IL具有字符串的元数据表示,允许将它们指定为常量.字符串常量还有其他有趣的属性,如实习.

一个兴趣点:您可以在C#中声明一个decimal字段const,但是它实际上没有CLR支持......没有文字形式.C#编译器使用该[DecimalConstant]属性伪造它.这就是为什么你不能使用decimal作为属性参数类型.

  • 正如Eric Lippert上周五也指出:http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-already-static.aspx (2认同)