有什么区别 const
和 readonly
你用另一个吗?
有什么区别 const
和 readonly
你用另一个吗?
除了明显的差异
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
。所有客户端都不需要重新编译。因此,如果您确信常量的值不会改变,请使用a const
。
public const int CM_IN_A_METER = 100;
但是如果你有一个可能改变的常数(例如w.r.t. precision)..或者有疑问,请使用a readonly
。
public readonly float PI = 3.14;
更新:Aku需要得到一个提及因为他首先指出了这一点。另外我需要插上我学到的东西.. 有效的C# - 比尔瓦格纳
有一个充满争议的问题!如果从另一个程序集引用常量,则其值将被编译到调用程序集中。这样,当您更新引用的程序集中的常量时,它将不会在调用程序集中更改!
只是要添加,ReadOnly用于引用类型只使引用readonly不是值。例如:
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};
public UpdateReadonly()
{
I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
I_RO_VALUE = new char[]{'V'}; //will cause compiler error
}
}
这解释了它。总结:const必须在声明时初始化,readonly可以在构造函数上初始化(因此根据使用的构造函数具有不同的值)。
编辑:看到Gishu的上面的细微差别
const
:任何地方都无法改变。
readonly
:此值只能在构造函数中更改。在正常功能中无法更改。
有一个小的陷阱与readonly。可以在构造函数中多次设置只读字段。即使该值在两个不同的链式构造函数中设置,它仍然是允许的。
public class Sample {
private readonly string ro;
public Sample() {
ro = "set";
}
public Sample(string value) : this() {
ro = value; // this works even though it was set in the no-arg ctor
}
}
常量成员在编译时定义,不能在运行时更改。常量被声明为一个字段,使用 const
关键字,必须在声明时初始化。
public class MyClass
{
public const double PI1 = 3.14159;
}
一个 readonly
成员就像一个常数,因为它代表了一种不变的价值。区别在于a readonly
成员可以在运行时,构造函数中初始化,也可以在声明它们时进行初始化。
public class MyClass1
{
public readonly double PI2 = 3.14159;
//or
public readonly double PI3;
public MyClass2()
{
PI3 = 3.14159;
}
}
常量
static
(它们是隐含的静态)只读
const是一个编译时常量,而readonly允许在运行时计算一个值,并在构造函数或字段初始化程序中设置。因此,'const'始终是常量,但'readonly'只有在分配后才是只读的。
Eric Lippert C#团队提供了有关不同类型的不变性的更多信息