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

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


当前回答

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

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

其他回答

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

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

只读字段的值可以更改。但是,常量字段的值不能更改。

在只读字段中,我们可以在声明时或在该类的构造函数中赋值。如果是常量,我们只能在声明时赋值。

只读可以与静态修饰符一起使用,但常量不能与静态一起使用。

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

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

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

常量成员是在编译时定义的,不能在运行时更改。常量使用const关键字声明为字段,并且必须在声明时进行初始化。

public class MyClass
{
    public const double PI1 = 3.14159;
}

只读成员就像一个常量,因为它代表一个不变的值。不同之处在于,只读成员可以在运行时在构造函数中初始化,也可以在声明时初始化。

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

常量

它们不能声明为静态(它们是隐式静态的)常数的值在编译时计算常量仅在声明时初始化

只读的

它们可以是实例级的,也可以是静态的该值在运行时计算readonly可以在声明中初始化,也可以通过构造函数中的代码初始化