String.Format和"string"+"string"或StringBuilder哪个更好?

20

2
@Shimmy:看这个:https://dev59.com/XHVD5IYBdhLWcg3wWaRh - shahkalpesh
http://blogs.msdn.com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx - Freelancer
1
http://www.codinghorror.com/blog/archives/001218.html - Freelancer
@自由职业者Jeff Atwood的帖子确实很棒!谢谢 - Shimmy Weitzhandler
2个回答

21
  • 编译器会尽可能优化字符串concat,所以例如仅为换行目的而分割的字符串通常可以优化为单个字符串字面量。
  • 与变量连接字符串将被编译为String.Concat
  • 如果您要对字符串进行多个(超过10个左右)“修改”,则StringBuilder可能会更快,但它会带来一些额外的开销,因为它在其缓冲区中分配的空间比所需的要多,并且在需要时调整其内部缓冲区大小。

我个人几乎所有时候都使用String.Format,原因有两个:

  • 维护格式字符串要容易得多,而不是重新排列一堆变量。
  • String.Format采用IFormatProvider,它被传递给任何嵌入在字符串中的IFormattable类型(如数字),以便您可以获得指定culture的适当数字格式,并且总体上有更多控制值的格式。

例如,由于某些文化使用逗号作为小数点,因此如果您想确保数字以您期望的方式格式化,则使用StringBuilderString.Format时,您需要确保指定CultureInfo.InvariantCulture

还有两件事要注意......

  • StringBuilder还具有AppendFormat函数,可以为您提供灵活的String.Format,而无需使用不必要的第二个缓冲区。
  • 在使用StringBuilder时,请确保不会通过将传递给Append的参数连接起来而使其失去意义。这是很容易忽略的一个问题。

1

没有实质性的区别。但是假设String.Format在内部使用了StringBuilder(你可以用Reflector工具看到),直接使用StringBuilder.Append应该更快。

编辑:当然,使用"+"运算符是最糟糕的选择,因为它会为每个要连接的字符串创建一个新的字符串实例。


根据我下面发布的链接,似乎“+”是最好的方式,所以你的方法是错误的。 - Shimmy Weitzhandler
1
@shimmy,那个链接中没有StringBuilder。此外,在那个测试中,您只连接了3个字符串,字符串的数量对性能影响很大。 - J-Rou
1
编辑是错误的。C#编译器将字符串或对象组装成一个数组,然后调用String.Concat()。我希望String.Concat(string[])是最有效的,因为实现可以分配恰好正确长度的字符串。 - Keith Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接