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

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


当前回答

常量

const关键字可以应用于字段或局部变量我们必须在声明时指定常量字段未分配内存,因为编译后常量值嵌入IL代码本身。这就像查找所有出现的常量变量并用其值替换。因此编译后的IL代码将使用硬编码值代替常量变量默认情况下,C#中的常量是静态的。所有对象的值都是常量存在dll版本控制问题-这意味着每当我们更改公共常量变量或属性时(事实上,理论上不应该更改),任何其他使用此变量的dll或程序集都必须重新构建只有C#内置类型可以声明为常量Const字段不能作为ref或out参数传递

只读

readonly关键字仅适用于字段而非局部变量我们可以在声明时或在构造函数中分配只读字段,而不是在任何其他方法中。为只读字段分配动态内存,我们可以在运行时获得该值。只读属于创建的对象,因此只能通过类的实例访问。为了使其成为类成员,我们需要在只读之前添加静态关键字。根据使用的构造函数,值可能不同(因为它属于类的对象)如果将非基元类型(引用类型)声明为只读,则只读引用是不可变的,而不是它所包含的对象。由于该值是在运行时获得的,因此只读字段/财产不存在dll版本控制问题。我们可以在构造函数上下文中将只读字段作为ref或out参数传递。

其他回答

常量

const关键字可以应用于字段或局部变量我们必须在声明时指定常量字段未分配内存,因为编译后常量值嵌入IL代码本身。这就像查找所有出现的常量变量并用其值替换。因此编译后的IL代码将使用硬编码值代替常量变量默认情况下,C#中的常量是静态的。所有对象的值都是常量存在dll版本控制问题-这意味着每当我们更改公共常量变量或属性时(事实上,理论上不应该更改),任何其他使用此变量的dll或程序集都必须重新构建只有C#内置类型可以声明为常量Const字段不能作为ref或out参数传递

只读

readonly关键字仅适用于字段而非局部变量我们可以在声明时或在构造函数中分配只读字段,而不是在任何其他方法中。为只读字段分配动态内存,我们可以在运行时获得该值。只读属于创建的对象,因此只能通过类的实例访问。为了使其成为类成员,我们需要在只读之前添加静态关键字。根据使用的构造函数,值可能不同(因为它属于类的对象)如果将非基元类型(引用类型)声明为只读,则只读引用是不可变的,而不是它所包含的对象。由于该值是在运行时获得的,因此只读字段/财产不存在dll版本控制问题。我们可以在构造函数上下文中将只读字段作为ref或out参数传递。

我相信常量值对于所有对象都是相同的(并且必须用文字表达式初始化),而只读对于每个实例化可以是不同的。。。

这说明了这一点。概要:const必须在声明时初始化,readonly可以在构造函数上初始化(因此,根据使用的构造函数,其值不同)。

编辑:关于细微的差异,请参见上面吉树的gotcha

常量:无法在任何地方更改。

只读:此值只能在构造函数中更改。无法在正常功能中更改。

ReadOnly:该值只能从类的构造函数初始化一次。const:可以在任何函数中初始化,但只能初始化一次