【问题标题】:Should a string constants class be static?字符串常量类应该是静态的吗?
【发布时间】:2013-11-10 08:16:48
【问题描述】:

我正在开发一个新项目,我注意到一些我不确定是否正确的代码。我用来证明问题的名称和值是假的。

public class MyConsts //Should it be static?
{
    public const string MyConst1 = "a";
    public const string MyConst2 = "b";
    public const string MyConst3 = "c";
    public const string MyConst4 = "d";
    ....
}

对于我的逻辑,这个类(只包含 consts 值)应该是静态的,所以没有初始化它的选项,这没有意义,对吗?

编辑:我是盲目地编写代码,所以我混淆了字符串和常量的顺序 - 因为它不是我的问题的目标,所以我已经解决了这个问题。

【问题讨论】:

  • 该类根本不应该存在。您想改用资源。
  • @JoelCoehoorn 我见过很多情况,这种方法非常适合,而资源充其量也不会带来任何好处。 IE。 HtmlTags.Div = "div" 非常适合作为常量集合,但如果放入资源中,则需要格外小心以避免本地化。
  • @JoelCoehoorn - 不,他应该有一个由ConstantsFactory 继承的IAbstractFactory,它从资源中读取常量,然后使用 IOC 容器注入它们。

标签: c# static constants


【解决方案1】:

是的,它是静态的是有意义的。这表示您的意图,甚至阻止客户端声明该类型的变量等。

您需要将const 修饰符移到类型部分之前:

public const string MyConst1 = "a";
...

如果值可能会改变,请考虑使用 public static readonly 字段而不是 const - 否则该值将被烘焙到任何引用常量的代码中,这意味着如果值发生,您需要重新构建任何客户端代码改变。

(另一种选择是使用常量internal 而不是public。)

【讨论】:

  • 谢谢。对静态的更改是否对内存或性能有任何影响? (因为我知道静态类在应用程序开始时编译,而不是在调用时编译)
  • @MishaZaslavsky:不——据我所知,您对静态类差异的“知识”是不真实的。
  • 静态类在编译其他所有内容时编译,它们在第一次访问时被初始化
【解决方案2】:

是的,课程应该是static。但相关的是,这些值实际上应该是const吗?

任何声明 const 的东西都将被编译到任何引用程序集中,所以如果这是一个类库,比如说,并且你发布了一个对这些 const 值进行更改的新版本,它们将不会被程序集拾取引用它们。

在这种特殊情况下,public static readonly string 是有道理的。

但是,如果它们仅在单个特定程序集(例如控制台应用程序或 WinForms 应用程序)中可见,那么您应该声明该类 internalconsts 可以按原样使用。

【讨论】:

    【解决方案3】:

    是的,如果值永远不会改变,它应该是静态的。正如你所说,让客户端代码实例化它是没有意义的。

    【讨论】:

      【解决方案4】:

      如果它只包含 consts 并且不包含任何其他内容,那么您最好将其设为静态类以防止实例化和阻塞。

      【讨论】:

        【解决方案5】:

        真的,这取决于你。对于纯实用程序类,静态确实派上用场。

        请记住,静态类是密封的;它不能被继承。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 1970-01-01
          • 2011-05-28
          相关资源
          最近更新 更多