我确信之前曾经问过这个问题,但在这个例子中,我很好奇其他人在将常数分离到这个程度时会有什么用处:
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的字符何时会在应用程序的可预见生命周期内发生变化?
答案 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)
如果你有预处理器指令,你可以根据你的构建指定不同的集合。这对于需要与语言无关的大型文本处理环境很有用(特别是在标点符号的使用方式不同的情况下)。