C#中的const和readonly有什么区别
你什么时候会用一个来代替另一个
除了
- 必须在定义
常量时声明值VS只读值可以动态计算,但需要在构造函数退出前赋值。。之后它就被冻结了 常量是隐式的静态的。您可以使用ClassName.ConstantName符号来访问它们
有一个微妙的区别。考虑一个在汇编语言> /代码>中定义的类。
公共类Const\u V\u只读
{
公共常数int I_const_VALUE=2;
公共只读输入值;
公共Const_V_Readonly()
{
I_RO_值=3;
}
}
AssemblyB引用AssemblyA并在代码中使用这些值。编译时:
- 对于
const值,它类似于查找替换。值2被“烘焙”到程序集B的IL中。这意味着如果明天我将I_CONST_VALUE更新为20,AssemblyB在我重新编译它之前仍然有2个 - 在
只读值的情况下,它类似于内存位置的ref。该值未烘焙到AssemblyB的IL中。这意味着,如果内存位置已更新,AssemblyB将在不重新编译的情况下获取新值。因此,如果I_RO_值更新为30,则只需构建AssemblyA,而无需重新编译所有客户端
因此,如果您确信常量的值不会改变,请使用常量
公用工程单位厘米米=100;
但是如果你有一个可能改变的常数(例如w.r.t.精度)。。或者,如果有疑问,请使用只读
公共只读浮点PI=3.14;
更新:Aku需要被提及,因为他首先指出了这一点。我还需要插入我学到这一点的地方:有效的C#-比尔·瓦格纳