更新时间:2021-12-02 03:56:58
除了明显的区别
const
时声明值 VS readonly
值可以动态计算,但需要在构造函数退出之前分配.. 之后它被冻结了.const
是隐含的 static
.您使用 ClassName.ConstantName
表示法来访问它们.const
VS readonly
values can be computed dynamically but need to be assigned before the constructor exits.. after that it is frozen.const
's are implicitly static
. You use a ClassName.ConstantName
notation to access them.有细微的差别.考虑在 AssemblyA
中定义的类.
There is a subtle difference. Consider a class defined in AssemblyA
.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
AssemblyB
引用 AssemblyA
并在代码中使用这些值.编译时:
AssemblyB
references AssemblyA
and uses these values in code. When this is compiled:
const
值的情况下,它就像一个查找替换.值 2 被烘焙到"AssemblyB
的 IL.这意味着,如果明天我将 I_CONST_VALUE
更新为 20,AssemblyB
在我重新编译之前仍然有 2.readonly
值的情况下,它就像一个 ref
到一个内存位置.该值未烘焙到 AssemblyB
的 IL.这意味着如果内存位置被更新,AssemblyB
无需重新编译即可获得新值.所以如果I_RO_VALUE
更新到30,只需要构建AssemblyA
,所有客户端都不需要重新编译.const
value, it is like a find-replace. The value 2 is 'baked into' the AssemblyB
's IL. This means that if tomorrow I update I_CONST_VALUE
to 20, AssemblyB
would still have 2 till I recompile it.readonly
value, it is like a ref
to a memory location. The value is not baked into AssemblyB
's IL. This means that if the memory location is updated, AssemblyB
gets the new value without recompilation. So if I_RO_VALUE
is updated to 30, you only need to build AssemblyA
and all clients do not need to be recompiled.因此,如果您确信常量的值不会改变,请使用 const
.
So if you are confident that the value of the constant won't change, use a const
.
public const int CM_IN_A_METER = 100;
但如果您有一个可能会改变的常量(例如 w.r.t. 精度).. 或者有疑问时,请使用 readonly
.
But if you have a constant that may change (e.g. w.r.t. precision).. or when in doubt, use a readonly
.
public readonly float PI = 3.14;
更新:Aku 需要提及,因为他首先指出了这一点.我还需要插入我学到的地方:Effective C# - Bill Wagner