我有个问题.最近我发现自己使用了3种不同的代码行,经过仔细检查后看起来和感觉都一样.
public static class constant
{
public static readonly int val1 = 5;
public const int val2 = 5;
public static int val3 { get { return 5; } }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,它们是否相同,是否应该使用另一个?如果是这样.什么时候?
作为视觉工作室中的一个额外问题,为什么它们在intellisense中的表现方式不同?

声明为readonly的成员可以在类的(静态)构造函数中进行更改,而const成员不能在运行时更改.
将字段声明为const会使其自动静态,引自§10.3.7:
当field,method,property,event,operator或constructor声明包含static修饰符时,它声明一个静态成员.另外,常量或类型声明隐式声明了静态成员.
第三个只是一个只读属性,总是返回5.
你永远不应该使用这样的属性,并尽可能选择const成员,以便允许编译器和/或抖动执行它们的优化,并帮助其他人阅读你的代码(该属性对我来说是一种WTF).如果需要在程序启动期间初始化的常量值(例如,机器的核心数),则必须使用静态只读成员.
这是C#规范(§10.5.2.1)的一个很好的例子:
当需要常量值的符号名称时,但在const声明中不允许值的类型时,或者在编译时无法计算值时,静态只读字段很有用.在示例中
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;
}
}
Run Code Online (Sandbox Code Playgroud)
黑色,白色,红色,绿色和蓝色成员不能声明为const成员,因为它们的值无法在编译时计算.但是,将它们声明为静态只读具有相同的效果.
还有另一个不同之处(§10.5.2.2):
常量和只读字段具有不同的二进制版本语义.当表达式引用常量时,常量的值在编译时获得,但是当表达式引用只读字段时,直到运行时才获取字段的值.
总而言之,它们是非常不同的,即使乍一看它们看起来很相似,你应该使用最适合你意图的那个.