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

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


当前回答

又一次抓住了。由于const实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。

其他回答

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

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

它们都是常量,但在编译时也可以使用常量。这意味着差异的一个方面是,可以使用常量变量作为属性构造函数的输入,但不能使用只读变量。

例子:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

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

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实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。