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

标签 c#

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

2) 由于编译器将常量变量替换为文字值,常量表达式需要在编译时完全求值的唯一原因是什么?

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

class A
{
    const string b = “it works”; 
}

谢谢

最佳答案

  1. 常量(用const声明)是implicitly static - 因此不需要实例。

  2. const 值嵌入到声明它的程序集中,然后每次使用 时,该值也被复制到调用代码中。因此无法在执行时对其进行评估 - 如果您想要这种行为,请使用 static readonly

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

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

关于c# - 为什么即使没有其类的实例,成员常量也可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3040516/

相关文章:

c# - 锁定问题 - 多线程使 LOOP 乱序

c# - 元组和类型化 View 的错误?

c# - 更新数据库命令在 ASP.Net Core/Entity Framework Core 中不起作用,因为数据库中的对象已经存在

c# - Visual Studio 2010 Pro,在应用程序关闭时不结束 Debug模式

c# - 评估两个列表之间顺序差异的算法

c# - 最合适的数据访问方式

c# - 确定派生类是否实现了以自身作为泛型参数的泛型接口(interface)

c# - 为什么方法不能像 func/action 委托(delegate)那样在语法上工作?

c# - 将控件可见性绑定(bind)到 ViewModel 属性不起作用

c# - 从mysql数据库导入数据后去掉Combobox中的所有空值