问题:
标记为const的字段只能在编译时初始化。你需要在运行时而不是在编译时将一个字段初始化为一个有效值。然后在应用程序剩余的生命周期内,这个字段必须像一个常量字段那样工作。
解决方案:
在代码中声明一个常量时有两种选择。可以使用readonly字段或const字段,每种方式都有优缺点。不过,如果你需要在运行时初始化一个常量字段,就必须使用readonly字段。
public class Foo
{
public readonly int bar;
public Foo() { }
public Foo(int constInitValue) { bar = constInitValue; }
// 类的其他部分
}
使用const字段无法做到这一点。const字段只能在编译时初始化。
public class Foo
{
public const int bar; // 这一行造成一个编译时错误
public Foo() { }
public Foo(int constInitValue)
{
bar = constInitValue; // 这一行同样造成一个编译时错误
}
// 类的其他部分
}
讨论:
readonly字段只允许在运行时在构造函数中执行初始化,而const字段必须在编译时进行初始化。因此,为了让一个必须为常量的字段在运行时初始化,唯一的方式是实现一个readonly字段。
只有两种方式可用于初始化一个readonly字段。第一种方式是向字段自身添加一个初始化器,代码如下所示:
public readonly int bar = 100;
第二种方式是通过一个构造函数初始化readonly字段。
(注:对于使用const字段的一个常见争论是,他们并不像readonly字段那样支持版本化。如果重新构建一个定义了const字段的组件,并且该const字段的值在之后的版本中发生了改变,那么使用旧版本构建的任何其他组件都不会获得新的值。只要一个字段将来有可能发生改变,就不要把它声明为一个const字段)
参考:
MSDN文档中的“const”和“readonly”关键字。