在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
下面是另一个链接,演示const如何不是版本安全的,或者与引用类型无关。
摘要:
const属性的值在编译时设置,不能在运行时更改Const不能被标记为静态的-关键字表示它们是静态的,而只读字段则可以。Const不能是除值(基元)类型以外的任何类型readonly关键字将字段标记为不可更改。但是,属性可以在类的构造函数内更改readonly关键字还可以与static组合,使其以与常量相同的方式(至少在表面上)起作用。当你观察两者之间的IL时,有一个显著的差异常量字段在IL中标记为“literal”,而readonly为“initonly”
其他回答
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是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置。因此,“const”总是常量,但“readonly”在赋值后是只读的。
C#团队的埃里克·里佩尔(Eric Lippert)有更多关于不同类型不变性的信息。
另外,只读引用类型只会使引用只读,而不会使值只读。例如:
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如何不是版本安全的,或者与引用类型无关。
摘要:
const属性的值在编译时设置,不能在运行时更改Const不能被标记为静态的-关键字表示它们是静态的,而只读字段则可以。Const不能是除值(基元)类型以外的任何类型readonly关键字将字段标记为不可更改。但是,属性可以在类的构造函数内更改readonly关键字还可以与static组合,使其以与常量相同的方式(至少在表面上)起作用。当你观察两者之间的IL时,有一个显著的差异常量字段在IL中标记为“literal”,而readonly为“initonly”