C#:最可读的字符串连接。 最佳实践

可能重复:
我该如何连接字符串?

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

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

您更喜欢什么?为什么效率无关紧要,但您想保持代码最符合您的口味?

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

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

反对:

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

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

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"; 

当性能很重要时,字符串构建器

String.Format(...)是最慢的。

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

对于简单的连接,使用StringBuilder进行简单连接也是最重要的,并且很可能是过多的开销。 我只会在循环中使用它。

对于像这样的东西(我猜是被发送到UI),我肯定更喜欢String.Format 。 它允许字符串容易国际化; 你可以grep调用String.Format并用你的翻译格式替换它们。

我个人的偏好是:

我发现+方法是最可读的,只有使用Format()或StringBuilder,如果有充分的理由(i18n,性能等)。 我(几乎)从不使用Concat。

我认为我发现+方法比Format()更容易阅读,因为我没有必要跳到最后才能看到{}占位符中放入了哪些变量。 如果占位符不是数字顺序,则更难以阅读imo。

但我想对于较大的项目,只需在样式指南中强制使用格式,以防代码可能(稍后)用于需要i18​​n的项目中。

  • 的String.format

    几个小组。 我用的更多

  • StringBuilder方法

即使表现不重要。 我必须遵守团队协议

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

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

另外,如果你曾经使用VB.NET,我喜欢Kathleen Dollard在hanselminutes的第152集中谈到的XML文字技术。

更喜欢使用:

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

用于复杂格式的String.Format ,如String.Format("{1}", 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");