C# 过度热心字符串常量

C# 过度热心字符串常量,c#,string,class-constants,C#,String,Class Constants,我相信以前有人问过这个问题,但在这个例子中,我很好奇其他人在将常数分离到这种程度时能看到什么有用之处: public class CoreStringConstants { // Common strings public const string SPACE = " "; public const string PERIOD = "."; public const string COMMA = ","; public const string COLON = ":";

我相信以前有人问过这个问题,但在这个例子中,我很好奇其他人在将常数分离到这种程度时能看到什么有用之处:

public class CoreStringConstants
 {
  // Common strings
  public const string SPACE = " ";
  public const string PERIOD = ".";
  public const string COMMA = ",";
  public const string COLON = ":";
  public const string SEMI_COLON = ";";
  public const string HYPHEN = "-";
  public const string UNDER_SCORE = "_";
  public const string LEFT_BRACKET = "(";
  public const string RIGHT_BRACKET = ")";
    public const string LEFT_SQUARE_BRACKET = "[";
    public const string RIGHT_SQUARE_BRACKET = "]";
    public const string LEFT_CURLY_BRACKET = "{";
    public const string RIGHT_CURLY_BRACKET = "}";
    public const string PIPE = "|";
    public const string CIRCUMFLEX = "^";
    public const string ASTERISK = "*";
。。。真的吗

从代码中分离这些类型的字符串常量真的有什么好处吗


在可预见的应用程序生命周期内,用于星号的字符何时更改 此外,还会有人编写代码来读取

public const string COLON = "*";

唯一的好处是编写
CoreStringConstants.SPACE
更清晰,更不容易出现未被注意到的打字错误。除此之外,做这样的事情真的没有什么好的理由

正如你所指出的,这些都不会改变,因此没有理由集中定义


哦,使用所有大写字母作为标识符是非常可怕的。

我想不出一个理由来解释为什么需要定义这些字符串常量。也许最初的作者认为只要定义一次字符串就可以节省一些内存,但是C#编译器足够聪明,可以插入字符串。(例如,相同的字符串常量将一次输出到程序集的.DATA部分。)


所以说,CoreStringConstants并没有很好的理由。

在您提供的示例中,这些常量是无用的,因为正如您所说,
星号总是
*

按照它们的实际用途命名会更有意义。例如,如果使用括号将字符串中的内容分组,则可以编写:

public const string GROUP_START = "(";
public const string GROUP_END = ")";

在这种情况下,这是有意义的,因为分组字符明天可能会变为方括号。

如果有预处理器指令围绕它们,则可以根据构建指定不同的预处理器指令集。这对于不依赖语言的大型文本处理环境(特别是标点符号使用方式不同的情况下)是很有帮助的。

有人之所以想这样做,有几个原因(尽管在这个时代没有必要喊出所有的常量!)。但是,您列出的特定定义不太可能有很多好的理由

  • 不同的字符编码可能意味着某些常量可能会更改。是的,在特定的字符编码中,“星号”可能与ASCII不同。也许在中文中,一个不同的字符可能比“”更可取。有可能吗?嗯,也许不是。。。但是在常量中包含这些值将使重构更容易

  • 根据使用情况,使用常量可以在整个代码中更改使用的字符,以便于重构。但是,在这种情况下,我会说这些常量的名称不好(例如,如果大括号表示作用域的开始,“开始作用域”将比“大括号”更好,从而允许您重新定义系统以使用(例如)尖括号而不是大括号来开始作用域,而不会使常量的名称变得混乱)

  • 程序员可能认为他将来可能会重构以使用字符串或字符,并且通过使用常量,这种选择在以后更容易重构。当然,人们应该对自己的设计更有信心:——)

  • 也许程序员认为常量会导致所有字符串共享而不是复制。字符串实习通常使这成为不必要的优化

  • 命名常量通常比内联的魔法常量更有意义,而且不太容易出现打字错误——这是我能想到的唯一“好”的理由


不,这没有帮助,但这可能来自Steve McConnel第12.7节命名常量中的建议。特别是他写的

避免使用文字,即使是“安全”的文字在下面的循环中,您认为12代表什么

代码不清晰的Visual Basic示例

对于i=1到12

   profit( i ) = revenue (i ) = expense ( i )
下一个

然后,他后来表明,最好在一年中用
NUM\u MONTHS\u替换12,或者在一月到一月之间执行

这很好,但是当您使用字符串来表示有意义且不神奇的字符串时,该建议没有将作为例外。例如,SQL字符串和正则表达式以及HTML和CSS字符串都有其含义,用户应该知道其含义


这类事情似乎是一个特殊的例子,看起来像是有人通过线路得到了报酬……这让我想起了这一点,诚实地说,我并不是在试图诱饵。我真的只是想知道为什么这可能是个好主意。这些字符串常量用于两个地方:调用sp和为用户生成消息。遗憾的是,我参与的项目不仅有
StringConstants
,还有
CharacterConstants
。有时为了保持一致性,我在使用
CharacterConstants.Period.ToString()
或定义
StringConstants
版本的
Period
之间左右为难。疯狂。至少我学会了什么是扬抑字符。:)那么,您将如何处理项目中大量这些“神奇”常量的存在?搜索并销毁?@serotonin:Resharper有一个非常好的“内联”重构工具。@serotonin-只需删除常量。编译器将有助于告诉您下一步要做什么。:-)可以使用ReSharper之类的工具内联常量,然后删除空类。(为了避免任何尖刻的评论……是的,我知道那个再尖刻的人
   profit( i ) = revenue (i ) = expense ( i )