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

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


当前回答

另外,只读引用类型只会使引用只读,而不会使值只读。例如:

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是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。

当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:

Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。

ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。

老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。

希望这有帮助,艾伦。

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

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

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

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

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
    }
}

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