在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
C#.Net中常量字段和只读字段之间存在显著差异
const在默认情况下是静态的,需要用常量值初始化,以后不能修改。构造函数中也不允许更改值。它不能与所有数据类型一起使用。对于ex-DateTime。它不能与DateTime数据类型一起使用。
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public readonly string Name = string.Empty; //No error, legal
只读可以声明为静态,但不是必需的。无需在声明时进行初始化。它的值可以使用构造函数赋值或更改。因此,它在用作实例类成员时具有优势。两个不同的实例化可能具有不同的只读字段值。对于ex-
class A
{
public readonly int Id;
public A(int i)
{
Id = i;
}
}
然后,只读字段可以用即时特定值初始化,如下所示:
A objOne = new A(5);
A objTwo = new A(10);
这里,实例objOne的只读字段值为5,objTwo的值为10。这不可能使用常量。
其他回答
原则上;您可以在运行时将静态只读字段的值分配给非常量值,而常量必须分配给常量值。
有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!
常量:无法在任何地方更改。
只读:此值只能在构造函数中更改。无法在正常功能中更改。
关键区别在于Const是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。
当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:
Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。
ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。
老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。
希望这有帮助,艾伦。
有一件事要补充人们上面所说的。如果程序集包含只读值(例如,只读MaxFooCount=4;),则可以通过使用不同的值(例如只读MaxFooCount=5;)发送该程序集的新版本来更改调用程序集看到的值
但如果使用常量,则在编译调用者时,它将被折叠到调用者的代码中。
如果你已经达到了C#的熟练程度,你就可以阅读比尔·瓦格纳的书《有效的C#:提高你的C语言的50种具体方法》了#它详细回答了这个问题(以及其他49个问题)。