在C#中常量和只读之间有什么区别?

你什么时候会用一个代替另一个?


当前回答

有一件事要补充人们上面所说的。如果程序集包含只读值(例如,只读MaxFooCount=4;),则可以通过使用不同的值(例如只读MaxFooCount=5;)发送该程序集的新版本来更改调用程序集看到的值

但如果使用常量,则在编译调用者时,它将被折叠到调用者的代码中。

如果你已经达到了C#的熟练程度,你就可以阅读比尔·瓦格纳的书《有效的C#:提高你的C语言的50种具体方法》了#它详细回答了这个问题(以及其他49个问题)。

其他回答

关键区别在于Const是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。

当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:

Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。

ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。

老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。

希望这有帮助,艾伦。

何时使用常量或只读常量编译时常量:绝对常量,值在声明期间设置,在IL代码本身中只读的运行时常量:可以通过配置文件(即App.config)在构造函数/init中设置,但一旦初始化就不能更改

常量将作为文本值编译到使用者中,而静态字符串将作为对定义值的引用。

作为练习,尝试创建一个外部库并在控制台应用程序中使用它,然后更改库中的值并重新编译它(而不重新编译用户程序),将DLL放入目录并手动运行EXE,您应该会发现常量字符串没有改变。

常量:无法在任何地方更改。

只读:此值只能在构造函数中更改。无法在正常功能中更改。

常量成员是在编译时定义的,不能在运行时更改。常量使用const关键字声明为字段,并且必须在声明时进行初始化。

public class MyClass
{
    public const double PI1 = 3.14159;
}

只读成员就像一个常量,因为它代表一个不变的值。不同之处在于,只读成员可以在运行时在构造函数中初始化,也可以在声明时初始化。

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

常量

它们不能声明为静态(它们是隐式静态的)常数的值在编译时计算常量仅在声明时初始化

只读的

它们可以是实例级的,也可以是静态的该值在运行时计算readonly可以在声明中初始化,也可以通过构造函数中的代码初始化