【问题标题】:C#: most readable string concatenation. best practice [duplicate]C#:最易读的字符串连接。最佳实践[重复]
【发布时间】:2011-03-17 15:44:19
【问题描述】:

可能重复:
How should I concatenate strings?

当性能不是important时,有几种方法可以在日常任务中连接字符串。

  • result = a + ":" + b
  • result = string.Concat(a, ":", c)
  • result = string.Format("{0}:{1}", a, b);
  • StringBuilder approach
  • ... ?

你更喜欢什么?如果效率并不重要,但你想保持代码的可读性最适合你的口味,为什么?

【问题讨论】:

  • 是的,它们看起来很相似,但我想专注于可读性方面,而不是内部实现和性能考虑。
  • FWIW,我相信 + 运算符无论如何都映射到 Concat 方法,所以前两个示例是等价的。
  • @musicfreak:从 IL 的角度来看,它们可能是等价的,但从可读性的角度来看,它们肯定不是。
  • 谢谢大家的回答。答案真的很主观,已经有很多类似的问题被问到了。

标签: c# string string-concatenation


【解决方案1】:

这取决于用途。当您只想连接两个字符串时,使用a + bstring.Format("{0}{1}", a, b) 更具可读性。但是,它变得越来越复杂,我更喜欢使用string.Format。比较一下:

string x = string.Format("-{0}- ({1})", a, b);

反对:

string x = "-" + a + "- (" + b + ")";

我认为在大多数情况下,很容易找到最易读的做事方式。在有争议的情况下,哪个更具可读性,只需选择一个,因为您的老板不会为这些毫无意义的讨论买单;-)

【讨论】:

  • +1 表示最后一句话。 :) 大多数时候真的没关系;你可以做一些比决定使用哪种字符串连接方法更有效率的事情。
  • 同意,但是当您必须维护该代码时,很难衡量重新学习您或其他人所做的事情所花费的时间。通常,当您还没有完全解决问题并且必须解决某些问题时,花在使某些东西更易于阅读和理解上的额外几秒钟会为您节省时间。所以你想编写易于理解的代码并养成良好的习惯。维护是您的开发人员最大的成本之一,也是您的老板绝对应该关心的事情。
  • @mattmc:DGMW:我认为可维护性(在正确性之后)是软件最重要的方面。在我的职业生涯中,我看到很多糟糕的代码变成了维护的噩梦。与您的大学讨论它对于就最易读的内容达成普遍共识很重要。然而,在这和生产力之间总是有一个权衡。正如你所说,很难衡量盈亏平衡点在哪里。进行这些讨论在一定程度上是有用的。我想说的是,对可读性太接近的几种风格进行无休止的讨论并不是很有用。
【解决方案2】:

string.Format 对我来说,但在实践中,我会使用适合目的的任何一个,同时考虑到性能和可读性。

如果是两个变量,我会使用。

string.Concat(str1, str2);

如果它包含一个常量或需要格式化的东西。

string.Format("{0} + {1} = {2}", x, y, x + y);

或者对于类似 SQL 查询的东西

string SqlQuery = "SELECT col1, col2, col3, col4" + 
                  "FROM table t " + 
                  "WHERE col1 = 1";

当性能很重要时,还有字符串生成器。

【讨论】:

  • 过早的优化是万恶之源。或者类似的东西。
  • +1 表示该方法。我什至创建了一个我经常使用的捷径
  • 我更喜欢使用多行字符串,而不是使用@符号连接多个字符串。
【解决方案3】:

String.Format(...) 最慢。

对于不在循环中发生的简单连接,请使用String.Concat(...)+ 运算符,它们在引擎盖下转换为相同的,afaik。更具可读性的是非常主观的。

使用StringBuilder 进行简单的串联对于简单的串联来说也太过分了,而且很可能开销太大。我只会循环使用它。

【讨论】:

  • 谢谢,但是你一般是怎么连接字符串的呢?格式、+、Concat ?
  • 我不会仅仅根据性能做出决定,除非性能是绝对关键的,并且已证明特定的 String.Format 调用应归咎于严重的性能问题。您通常应该更喜欢可读性和可维护性而不是性能。话虽如此,我对这个答案没有任何问题,因为它是事实,但让我印象深刻的是,这意味着性能是王道,实际上它应该是你最后考虑的因素,因为速度的差异是以几分之一来衡量的毫秒。
  • 最“普通”的方式是使用+Concat,这在引擎盖afaik 下是相同的,你发现它更具可读性是非常主观的。我不会将String.Format(...) 用于简单的事情,因为它速度较慢(必须解析格式字符串)并且更容易出错。
【解决方案4】:

对于这样的事情(我猜它正在被发送到 UI),我肯定更喜欢String.Format。它使字符串易于国际化;您可以使用 grep 调用 String.Format 并将其替换为您的翻译格式。

【讨论】:

  • +1 表示本地化。
【解决方案5】:

我的个人喜好是:

我发现 + 方法最易读,并且只有在有充分理由(i18n、性能等)的情况下才使用 Format() 或 StringBuilder。我(几乎)从不使用 Concat。

我认为我发现 + 方法比 Format() 更易于阅读,因为我不必跳到最后查看 {} 占位符中放入了哪些变量。而且,如果占位符不是按数字顺序排列的,则阅读 imo 会变得更加困难。

但我想对于较大的项目,通过样式指南简单地强制使用 Format 是有意义的,以防以后代码可能(重新)用于需要 i18n 的项目中。

【讨论】:

    【解决方案6】:
    • 字符串格式

      对于一些连接。更多我使用

    • StringBuilder 方法

    即使性能并不重要。我必须遵守团队协议

    【讨论】:

    • 谢谢,我们也一样。虽然有些开发者倾向于使用 +
    【解决方案7】:

    我更喜欢 String.Format 用于小字符串,而 StringBuilder 用于更大的字符串。我的主要原因是可读性。使用 String.Format(或 StringBuilder.AppendFormat())对我来说更具可读性,但我不得不承认这只是个人喜好。

    对于非常大的文本生成,您可能需要考虑使用新的 (VS2010) T4 预处理模板 - 它们非常好。

    另外,如果您使用过 VB.NET,我喜欢 Kathleen Dollard 在 episode 152 of hanselminutes 中谈到的 XML 文字技术。

    【讨论】:

    • 还要注意string.Format在内部使用StringBuilder
    【解决方案8】:

    喜欢使用:

    String.Concat 用于简单的连接,例如 String.Concat("foo", bar);

    String.Format 用于复杂格式,例如 String.Format("<a href=\"{0}\">{1}</a>", url, text);

    StringBuilder 用于大量连接,例如:

    var sb = new StringBuilder();
    sb.AppendLine("function fooBar() {");
    sp.AppendLine(String.Join(Environment.NewLine, blah));
    sp.AppendLine("}");
    page.RegisterClientScript(page.GetType(), sb.ToString());
    

    宁愿避免"foo" + "bar"(以及if (foo == "bar")。尤其是String.Format("{0}{1}", foo, bar)

    throw new Exception("This code was" +
        "written by developer with" +
        "13\" monitor");
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2018-12-18
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2011-01-10
      • 2014-04-01
      相关资源
      最近更新 更多