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

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


当前回答

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

其他回答

有一个只读的小陷阱。只读字段可以在构造函数中设置多次。即使在两个不同的链式构造函数中设置了该值,它仍然是允许的。

public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

标记为const的变量只不过是强类型的#define宏,在编译时,const变量引用被替换为内联文本值。因此,只能以这种方式使用某些内置基元值类型。标记为只读的变量可以在运行时在构造函数中设置,并且它们的只读性也在运行时强制执行。与此相关的性能开销较小,但这意味着您可以对任何类型(甚至引用类型)使用只读。

此外,常量变量本质上是静态的,而只读变量如果需要可以是特定于实例的。

原则上;您可以在运行时将静态只读字段的值分配给非常量值,而常量必须分配给常量值。

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

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

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