关于c#:具有静态属性的静态类

Static class with static properties

本问题已经有最佳答案,请猛点这里访问。

我试图在一个类中收集应用程序中的所有字符串声明,以便在整个项目范围内修改它们。我可以创建一个这样的Strings类:

1
2
3
4
public static class Strings
{
    public static readonly string Title ="App Title";
}

或者像这样:

1
2
3
4
public static class Strings
{
    public const string Title ="App Title";
}

类应该是静态的,并且所有属性都是常量。Strings的属性中是否有static readonlyconst关键字有什么区别?


您可以通过一个简单的示例来查看差异:

1
2
3
4
5
6
7
8
9
10
11
void Main()
{
    var f = F.Foo;
    var b = F.Bar;
}

public class F
{
    public const string Foo ="F";
    public static readonly string Bar ="B";
}

将产生以下IL:

1
2
3
4
5
IL_0001:  ldstr      "F"
IL_0006:  stloc.0     // f
IL_0007:  ldsfld      UserQuery+F.Bar
IL_000C:  stloc.1     // b
IL_000D:  ret

Fooconst值在编译时"烘焙"到调用站点,这就是为什么您看到值为"f"本身的ldstrstatic字段发出ldsfld的原因,它在运行时加载字段,然后将其分配给局部变量b

同时生成staticconst字段是编译时错误。conststatic都是在类型上定义的,而不是实例。更重要的是,可以在运行时设置static字段,而const必须在编译时已知。

如果您想设置一组在运行时不会改变的常量值,那么使用const就可以了。但是你必须记住,如果你改变一个const值,那么它不足以编译保存常量的源代码,你也必须重新编译任何使用该const的用户。