c#中的常量和只读?

时间:2010-04-01 08:39:45

标签: c#

  

可能重复:
  What is the difference between const and readonly?

我对c#有疑问,对于简单问题或任何参考,常数和只读解释有什么区别。

8 个答案:

答案 0 :(得分:12)

const在编译时初始化,无法更改。

readonly在运行时初始化,但只能执行一次(在构造函数或内联声明中)。

答案 1 :(得分:4)

const是一个编译时常量:您给出的值会在编译时插入到代码中。这意味着您只能拥有编译器理解的常量类型值,例如整数和字符串。与readonly不同,您无法将函数的结果分配给const字段,例如:

class Foo {
  int makeSix() { return 2 * 3; }
  const int const_six = makeSix(); // <--- does not compile: not initialised to a constant
  readonly int readonly_six = makeSix(); // compiles fine
}

另一方面,readonly字段在运行时初始化,可以具有任何类型和值。 readonly标记仅表示该字段一旦设置就永远不会重新分配。

请注意:只读集合或对象字段仍然可以更改其内容,而不是已设置的集合的标识。这完全有效:

class Foo {
  readonly List<string> canStillAddStrings = new List<string>();

  void AddString(string toAdd) {
    canStillAddStrings.Add(toAdd);
  }
}

但在这种情况下我们无法替换引用:

class Foo {
  readonly List<string> canStillAddStrings = new List<string>();

  void SetStrings(List<string> newList) {
    canStillAddStrings = newList; // <--- does not compile, assignment to readonly field
  }
}

答案 2 :(得分:3)

必须在编译时知道常量(const)。

可以使用运行时已知的值初始化(并且仅初始化)

readonly个字段。

答案 3 :(得分:2)

const永远不会改变,声明的值会在编译时烧入代码。

readonly字段在运行时初始化,但只能在对象的构造函数或字段声明本身中初始化。

答案 4 :(得分:2)

如果在编译时计算const值,如果在assembly2中定义的assembly1中使用const,则需要在const值更改的情况下再次编译assembly1。 由于评估是在运行时,因此readonly字段不会发生这种情况。

答案 5 :(得分:1)

答案 6 :(得分:1)

constast在运行时初始化,可以用作静态成员。 readonly可以在运行时初始化,只有一次。

答案 7 :(得分:0)

在c#中,必须在编译时为常量成员分配值。但是您可以在运行时初始化一次只读成员。