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 )