17

可能重复:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs“string”+“string”或StringBuilder?

什么是效率优先,哪些应该是喜欢每个以下条件:

String.Format("{0}, {1}", city, state); 

city + ", " + state; 

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy:看看这个http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh 2009-05-28 03:31:11

+0

http://blogs.msdn。com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx – Freelancer 2013-05-28 10:41:04

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer 2013-05-28 11:04:32

回答

18
  • 编译器将优化尽可能多的字符串concat,因此,例如,为断行目的而分解的字符串通常可以优化为单个字符串文字。
  • 级联使用的变量会被编译成String.Concat
  • StringBuilder的可快了很多,如果你正在做一些(超过10个,所以我猜)“修改”的字符串,但它会带来一些额外的开销,因为它会在缓冲区中分配比您需要的更多空间,并在需要时调整内部缓冲区的大小。

我个人使用的String.Format几乎所有的时间,原因有二:

  • 这是一个更容易维护格式字符串比重新安排一组变量。
  • String.Format采用IFormatProvider传递给嵌入在字符串中的任何IFormattable类型(如数字),以便为指定的区域性获得适当的数字格式,并且更好地控制如何对值进行格式化。

例如,因为有些文化使用逗号作为小数点你想以确保无论是StringBuilder的或的String.Format您指定CultureInfo.InvariantCulture如果你想确保数字被格式化你想让你的方式。

两件事要注意...

  • StringBuilder的也有一个AppendFormat功能,让你的String.Format的灵活性,而无需不必要的第二缓冲器。
  • 当使用StringBuilder时,确保您不会通过连接传递给Append的参数来达到目的。这是一个容易错过的人。
1

没有相关性差异。但假设String.Format内部使用StringBuilder(可以使用Reflector工具查看),直接使用StringBuilder.Append应该更快。

编辑:当然,使用“+”运算符是最差的选项,因为它为每个串联的字符串创建一个新的字符串实例。

+0

错,根据我贴的波纹管的链接,好像比+最好的方法是 – Shimmy 2009-05-28 04:18:56

+1

@shimmy,那个链接里没有StringBuilder。另外,在那个测试中,你只连接3个字符串,字符串的数量会影响性能。 – 2013-03-29 23:33:25

+0

编辑错误。 C#编译器将字符串或对象组装成一个数组,然后调用String.Concat()。我希望String.Concat(string [])是最有效的,因为实现可以将字符串分配给正确的长度。 – 2017-10-27 17:28:00

相关问题