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

C# 为什么即使没有its类的实例,成员常量也可用?,c#,C#,1为什么即使没有its类的实例,成员常量也可用 2是编译器将常量变量替换为文字值而需要在编译时完全计算常量表达式的唯一原因吗 3由于string也是一个对象,我认为下面的代码会产生错误,但事实并非如此。为什么? class A { const string b = “it works”; } 多谢各位 使用const声明的常量是-因此不需要实例 常量值嵌入在声明它的程序集中,然后每次使用它时,该值也被复制到调用代码中。因此,不能在执行时对其进行评估-如果您想要这种行为,请使用静态只读

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

2是编译器将常量变量替换为文字值而需要在编译时完全计算常量表达式的唯一原因吗

3由于string也是一个对象,我认为下面的代码会产生错误,但事实并非如此。为什么?

class A
{
    const string b = “it works”; 
}
多谢各位

使用const声明的常量是-因此不需要实例

常量值嵌入在声明它的程序集中,然后每次使用它时,该值也被复制到调用代码中。因此,不能在执行时对其进行评估-如果您想要这种行为,请使用静态只读

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

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

使用const声明的常量是-因此不需要实例

常量值嵌入在声明它的程序集中,然后每次使用它时,该值也被复制到调用代码中。因此,不能在执行时对其进行评估-如果您想要这种行为,请使用静态只读

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


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

正如Eric Lippert上周五也指出的:@Johannes:我只是在挖掘帖子:在这些评论中,星期五意味着星期四。。。。取决于时区:-正如埃里克·利珀特(Eric Lippert)上周五也指出的:@Johannes:我只是在挖掘帖子:在这些评论中,星期五意味着星期四。。。。根据时区:-