【问题标题】:Static class with static properties [duplicate]具有静态属性的静态类[重复]
【发布时间】:2015-08-13 06:09:32
【问题描述】:

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

public static class Strings
{
    public static readonly string Title = "App Title";
}

或者像这样:

public static class Strings
{
    public const string Title = "App Title";
}

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

【问题讨论】:

  • const 暗示 static,但该语言不允许您同时使用这两个关键字。
  • 也许最大的区别是const 会编译,而static const 不会。你的意思是static readonly
  • “集中所有字符串”是什么意思?
  • 谢谢,我不知道它不会编译。在我真正尝试构建之前,Visual Studio 没有显示任何错误。
  • 您可能想考虑使用资源字符串文件 (.resx),特别是如果将来可能需要本地化。

标签: c# .net


【解决方案1】:

你可以通过一个简单的例子来看看区别:

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:

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”本身的 ldstr,而 static 字段会发出 @987654327 @,它在运行时加载该字段,然后将其分配给局部变量b

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

如果你想设置一堆在运行时不会改变的常量值,使用const 应该没问题。但是您必须记住,如果您更改 const 的值,仅编译包含 const 的源代码是不够的,您还必须重新编译使用该 const 的任何人。

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 2014-12-07
    • 1970-01-01
    • 2018-08-18
    • 2020-05-23
    • 2020-03-30
    • 2011-04-21
    • 2017-06-07
    相关资源
    最近更新 更多