过分热情的字符串常量

时间:2010-11-17 22:48:11

标签: 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 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 = "*";

......真的吗?

将这些字符串常量从代码中分离出来真的有什么好处吗?

用于ASTERISK的字符何时会在应用程序的可预见生命周期内发生变化?

7 个答案:

答案 0 :(得分:4)

实际上,我认为这是一个缺点。至少可以说好处是可疑的,特别是因为无论如何都支持汇集字符串文字,作为开发人员,当我第一次遇到这样的代码时,我必须查找每个常量的值。

此外,某人提出读取

的代码
public const string COLON = "*";

答案 1 :(得分:2)

在您提供的示例中,常量是无用的,因为正如您所说,ASTERISK始终是*

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

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

在这种情况下,它是有道理的,因为分组字符明天可以更改为方括号。

答案 2 :(得分:1)

我想不出为什么需要定义这些字符串常量的原因。也许原作者认为通过一次定义字符串可以节省一些内存,但C#编译器足够聪明到实习字符串。 (例如,相同的字符串常量将输出到程序集的.DATA部分中。)

var space1 = " ";
var space2 = " ";
Console.WriteLine(Object.ReferenceEquals(space1, space2));  // Outputs true

因此,CoreStringConstants确实没有良好的原因。

答案 3 :(得分:1)

为什么有人可能想要这样做有几个原因(虽然没有必要在这个时代大喊大叫所有常量!)。但是,您列出的特定定义不太可能有很多原因。

  • 不同的字符编码可能意味着某些常量可能会发生变化。是的,“可能”在特定字符编码中,“星号”与ASCII“”不同。也许在中文中,不同的角色可能比“”更可取。可能吗?好吧,也许不是......但是在常量中使用这些值会使重构变得更容易。

  • 根据用途,使用常量允许在整个代码中更改用于更容易重构的字符。但是,在这种情况下,我会说这些常量命名不佳(例如,如果花括号表示范围的开头,“start scope”将是一个比“花括号”更好的名称,允许您重新定义要使用的系统(例如,使用尖括号代替大括号来启动范围,而不会使常量的名称变得混乱)

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

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

  • 命名常量通常比内联魔术常量更有意义,并且更不容易出现拼写错误 - 这是我能想到的唯一“好”理由。

答案 4 :(得分:1)

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

  

避免使用文字,甚至是“安全” 在以下循环中,您认为12代表什么?

     

不清楚代码的Visual Basic示例

     

对于i = 1到12

   profit( i ) = revenue (i ) = expense ( i )
     

下一步

然后他后来表明用NUM_MONTHS_IN_YEAR替换12或做from Month_January to Month_Decemener

会更好

这一切都很好而且 当您使用 字符串时, 的例外情况 em> 并不是魔术。例如,SQL字符串和正则表达式以及HTML和CSS字符串具有含义,其含义应为用户所熟知。

这种事情似乎是这个question

的具体情况

答案 5 :(得分:0)

唯一的好处是写CoreStringConstants.SPACE会比" "更清晰,更不容易被忽视错别字。除此之外,没有任何理由做出类似的事情。

正如你所指出的,这些都不会改变,所以没有这样的理由来集中定义。

哦,使用标识符的所有大写只是可怕的。

答案 6 :(得分:0)

如果你有预处理器指令,你可以根据你的构建指定不同的集合。这对于需要与语言无关的大型文本处理环境很有用(特别是在标点符号的使用方式不同的情况下)。