字符串常量被高估了吗?

4 string constants

这很容易像失去奇数的轨道0,15.当我编写低级C代码时,我曾经对此非常严格.随着我对XML和SQL所涉及的所有字符串文字的更多工作,我发现自己经常违反在代码中嵌入常量的规则,至少在涉及字符串文字时.(我对数字常数仍然很好.)

字符串与数字不同.创建一个与其值(Eg const string NameField = "Name";)具有相同名称的编译时常量感觉乏味且有点愚蠢,尽管在许多位置重复相同的字符串文字似乎有风险,但由于复制,很可能会出现拼写错误当我重构时,我通常会做一个全局搜索,其中涉及的不仅仅是改变事物的名称,比如它在周围的事物上的功能处理方式.

所以,假设你没有一个好的XML序列化器(或者没有心情设置它).您个人会使用以下哪些(如果您在某些代码审查中没有试图屈服于同行压力):

static void Main(string[] args)
{
    // ...other code...

    XmlNode node = ...;

    Console.WriteLine(node["Name"].InnerText);
    Console.WriteLine(node["Color"].InnerText);
    Console.WriteLine(node["Taste"].InnerText);

    // ...other code...
}
Run Code Online (Sandbox Code Playgroud)

要么:

class Fruit
{
    private readonly XmlNode xml_node;

    public Fruit(XmlNode xml_node)
    {
        this.xml_node = xml_node;
    }

    public string Name
    { get { return xml_node["Name"].InnerText; } }

    public string Color
    { get { return xml_node["Color"].InnerText; } }

    public string Taste
    { get { return xml_node["Taste"].InnerText; } }
}

static void Main(string[] args)
{
    // ...other code...

    XmlNode node = ...;
    Fruit fruit_node = new Fruit(node);

    Console.WriteLine(fruit_node.Name);
    Console.WriteLine(fruit_node.Color);
    Console.WriteLine(fruit_node.Taste);

    // ...other code...
}
Run Code Online (Sandbox Code Playgroud)

小智 11

定义的常量更容易重构.如果"名称"最终被使用了三次并且您将其更改为"FullName",则更改常量是一次更改而不是三次.

  • @Eddie,它还会捕获每个其他使用"Name"的const字符串XmlNodeName ="Name"; const string AddressName ="Name"; const string XmlFruitName ="Name"; 如果您在任何地方硬编码"名称"并且仅更改了XmlNodeName,该怎么办? (3认同)

Ger*_*ald 5

对于类似的东西,它取决于常量的使用频率.如果它只是在你的例子中的一个地方,那么硬编码是好的.如果它在许多不同的地方使用,肯定使用常量.如果你不小心,一个错字可能会导致数小时的调试,因为你的编译器不会注意到你输入"Tsate"而不是"Taste",而它会注意到你输入了fruit_node.Tsate而不是fruit_node.味道.

编辑:我现在看到你提到了复制和粘贴,但如果你这样做,你可能也会因为没有创建常量而失去你节省的时间.通过智能感知和自动完成,您可以通过几次击键获得常量,而不是经历复制/粘贴的麻烦.