除了明显的差异
const
VS 的定义时声明值readonly
值可以动态计算,但需要在构造函数退出之前分配.. 之后它被冻结。 static
。您使用ClassName.ConstantName
表示法来访问它们。 有一个微妙的区别。考虑在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
并在代码中使用这些值。编译时,
const
值的情况下,它就像一个 find-replace,值 2 被 '烘焙' 到AssemblyB
的 IL 中。这意味着如果明天我将来会将I_CONST_VALUE
更新为 20。 AssemblyB
仍然会有 2,直到我重新编译它 。 readonly
值的情况下,它就像是对内存位置的ref
。该值未包含在AssemblyB
的 IL 中。这意味着如果更新内存位置, AssemblyB
将获取新值而无需重新编译。因此,如果I_RO_VALUE
更新为 30,则只需构建AssemblyA
。所有客户端都不需要重新编译。 因此,如果您确信常量的值不会更改,请使用const
。
public const int CM_IN_A_METER = 100;
但是如果你有一个可能改变的常数(例如精确度)...... 或者有疑问时,请使用readonly
。
public readonly float PI = 3.14;
更新:Aku 需要提一下因为他首先指出了这一点。另外我需要插上我学到的东西.. 有效的 C# - 比尔瓦格纳
有一个充满争议的问题!如果从另一个程序集引用常量,则其值将被编译到调用程序集中。这样,当您更新引用的程序集中的常量时,它将不会在调用程序集中更改!