声明为readonly的成员变量可以在类的(静态)构造函数中被更改,而const成员变量在运行时不能更改。
将字段声明为const会自动使其成为静态常量,引用自§10.3.7:
“当字段、方法、属性、事件、运算符或构造函数声明包括static修饰符时,它声明一个静态成员。此外,常量或类型声明隐式声明一个静态成员。”
第三个是只读属性,总是返回5。
尽可能使用const成员,以便允许编译器和/或JIT执行其优化,并帮助其他人阅读您的代码(该属性对我来说有点奇怪)。 如果需要在程序启动期间初始化常量值(例如,机器核心数),则必须使用静态readonly成员。
这是C#规范(§10.5.2.1)的一个很好的例子:
“当需要符号名称表示常量值,但值的类型不允许在const声明中使用,或者值无法在编译时计算时,静态readonly字段非常有用。”
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) {
red = r;
green = g;
blue = b;
}
}
黑色、白色、红色、绿色和蓝色成员不能被声明为常量成员,因为它们的值无法在编译时计算。然而,将它们声明为静态只读字段具有相同的效果。
另外一个不同之处是:常量和只读字段具有不同的二进制版本控制语义。当表达式引用常量时,常量的值在编译时获取,但当表达式引用只读字段时,字段的值直到运行时才会获取。
总之,尽管乍一看它们可能看起来相似,但它们非常不同,您应该使用最适合您意图的那个。