我对c#有疑问,对于简单问题或任何参考,常数和只读解释有什么区别。
答案 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)
Google,有人吗?
答案 6 :(得分:1)
constast在运行时初始化,可以用作静态成员。 readonly可以在运行时初始化,只有一次。
答案 7 :(得分:0)
在c#中,必须在编译时为常量成员分配值。但是您可以在运行时初始化一次只读成员。