2

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

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 的字符何时会发生变化?

4

7 回答 7

4

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

此外,有人想出如下代码

public const string COLON = "*";
于 2010-11-17T22:54:16.227 回答
2

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

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

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

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

于 2010-11-17T23:00:26.010 回答
1

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

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

所以老实说,CoreStringConstants 没有充分的理由。

于 2010-11-17T22:57:47.270 回答
1

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

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

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

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

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

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

于 2010-11-17T23:06:29.483 回答
1

不,这无济于事,但这可能来自 Steve McConnel 的代码完成部分 12.7 命名常量中的建议。具体来说,他写道

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

不清晰代码的 Visual Basic 示例

对于 i = 1 到 12

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

下一个

然后他后来表明最好将 12 替换为NUM_MONTHS_IN_YEARor 做from Month_January to Month_Decemener

这一切都很好,但是当你使用一个有意义且不是魔法的字符串时,建议没有例外。例如 SQL 字符串和正则表达式以及 HTML 和 CSS 字符串是有意义的,并且用户应该知道这些含义。

这种事情似乎是这个问题的一个具体案例

于 2010-11-17T23:11:08.937 回答
0

唯一的好处是写作CoreStringConstants.SPACE会比" ". 除此之外,没有任何充分的理由去做这样的事情。

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

哦,对标识符使用全部大写实在是太可怕了。

于 2010-11-17T22:55:22.963 回答
0

如果您在它们周围有预处理器指令,则可以根据您的构建指定不同的集合。这在需要与语言无关的大型文本处理环境中很有帮助(尤其是在标点符号使用不同的情况下)。

于 2010-11-17T23:00:59.937 回答