C#中的常量和只读


constant and readonly in c#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the difference between const and readonly?

我在C中有疑问,常数和只读的区别是什么,用简单的问题或任何参考来解释。


const在编译时初始化,不能更改。

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


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

1
2
3
4
5
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标记只意味着一旦设置了字段,就不能重新分配它。

但是要小心:只读集合或对象字段的内容仍然可以更改,而不是设置的集合的标识。这是完全有效的:

1
2
3
4
5
6
7
class Foo {
  readonly List<string> canStillAddStrings = new List<string>();

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

但在这种情况下,我们无法替换参考文献:

1
2
3
4
5
6
7
class Foo {
  readonly List<string> canStillAddStrings = new List<string>();

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


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

readonly字段可以用运行时已知的值初始化(并且只能初始化)。


因为const值是在编译时计算的,如果在assembly2中定义的assembly1中使用const,则需要再次编译assembly1,以防const值更改。这不会发生在只读字段中,因为Evaluarion处于运行时。


const不能更改,声明的值在编译时被烧录到代码中。

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


consast在运行时初始化,可以用作静态成员。只读在运行时只能初始化一次。


谷歌,有人吗?

  • http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx
  • http://www.c-sharpcorner.com/uploadfile/sayginteh/constandardoronly1112005005151am/constandardoronly.aspx
  • http://weblogs.asp.net/psteele/archive/2004/01/27/63416.aspx

在C中,常量成员必须在编译时被赋值。但可以在运行时初始化一次只读成员。