在C#中常量和只读之间有什么区别?

你什么时候会用一个代替另一个?


当前回答

常量必须是硬编码的,其中可以在类的构造函数中设置为只读。

其他回答

有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!

只读:可以在运行时通过Ctor更改值。但不通过成员函数

常量:默认情况下为静态。值不能从任何位置更改(Ctor、Function、runtime等no where)

常量将作为文本值编译到使用者中,而静态字符串将作为对定义值的引用。

作为练习,尝试创建一个外部库并在控制台应用程序中使用它,然后更改库中的值并重新编译它(而不重新编译用户程序),将DLL放入目录并手动运行EXE,您应该会发现常量字符串没有改变。

下面是另一个链接,演示const如何不是版本安全的,或者与引用类型无关。

摘要:

const属性的值在编译时设置,不能在运行时更改Const不能被标记为静态的-关键字表示它们是静态的,而只读字段则可以。Const不能是除值(基元)类型以外的任何类型readonly关键字将字段标记为不可更改。但是,属性可以在类的构造函数内更改readonly关键字还可以与static组合,使其以与常量相同的方式(至少在表面上)起作用。当你观察两者之间的IL时,有一个显著的差异常量字段在IL中标记为“literal”,而readonly为“initonly”

Const:应用程序生命周期内的绝对常量值。

只读:可以在运行时更改。