常量和只读在C#中?
可能重复:
const和readonly有什么区别?
我有疑问在C#有什么区别在常量和只读解释与简单的问题或任何参考。
const
在编译时被初始化,并且不能被改变。
readonly
在运行时初始化,但只能执行一次(在构造函数或内联声明中)。
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
}
}
常量( const
)必须在编译时已知。
readonly
字段可以在运行时使用已知值进行初始化(并且仅初始化)。