一个字符串常量类应该是静态的吗?

19
我正在开发一个新项目,我注意到一些代码不确定是否正确。此处使用的名称和值均为虚假数据。
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";
    ....
}

根据我的逻辑,这个类(仅包含常量值)应该是静态的,因此无法初始化,这没有意义,我正确吗?

编辑:我盲目编写代码,所以混淆了字符串和常量的顺序 - 因为这不是我的问题的重点,所以我已经进行了修正。


1
这个类根本不应该存在。你应该使用资源。 - Joel Coehoorn
3
我看过许多情况,这种方法非常适合且资源最多只能提供很少好处。例如,将 HtmlTags.Div = "div" 定义为一组常量是完全可以的,但如果放入资源文件中,则需要额外小心以避免本地化问题。 - Alexei Levenkov
2
@JoelCoehorn - 不,他应该拥有一个IAbstractFactory,该工厂被ConstantsFactory继承,并从资源中读取常量,然后使用IOC容器进行注入。 - Davor
5个回答

35

是的,将其设置为静态是有意义的。这表示您的意图,防止客户端甚至声明该类型的变量等。

不过,您需要将const修饰符放在类型部分之前:

public const string MyConst1 = "a";
...
如果数值可能会改变,请考虑使用 public static readonly 字段而不是 const。否则,该值将嵌入到引用常量的任何代码中,这意味着如果值发生更改,则需要重新构建任何客户端代码。
(另一个选项是将常量设置为 internal 而不是 public。)

2
谢谢。将类改为静态对内存或性能有影响吗?(因为据我所知,静态类在应用程序启动时编译,而不是在调用时编译) - Misha Zaslavsky
3
不行 - 根据我所知,你对静态类的区别的"了解"是不正确的。 - Jon Skeet
静态类在编译其他所有内容时被编译,它们在第一次访问时被初始化。 - Brad

6

是的,这个类应该是static的。但相关的,那些值是否应该实际上是const的呢?

任何声明为const的内容都将编译到任何引用的程序集中。所以如果这是一个类库,当您发布包含对这些const值更改的新版本时,它们不会被引用它们的程序集所接受。

在这种情况下,public static readonly string是有意义的。

但是,如果这些只在单个特定程序集内可见(例如控制台应用程序或WinForms应用程序),则应将该类声明为internal,并且这些const就可以按原样使用。


2

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


1
如果只包含const,并且不包含其他内容,则最好将其设置为静态类,以防止实例化和堵塞。

0

其实,这取决于你。静态类对于纯实用类确实很有用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接