2012-08-02 59 views
5

我正在阅读一本名为.NET Gotchas(非常值得一读的IMO),它说明了String和StringBuilder之间的性能差异,并提出了一个问题,觉得无法解答!我不知道任何一个班级的内部情况(没有查看这些班级的反映版本),我想知道;因为.NET中的运算符是可重载的,为什么Microsoft没有实现String类来在内部使用StringBuilder并重载连接运算符来简单地在StringBuilder中调用.Append()?我猜测有一些潜在的原因,为什么不是这样,如果是这样,为什么?.NET字符串连接(+&+ =)与StringBuilder

回答

6

问题不在于字符串连接速度慢,而在于重复连接创建了大量需要分配并随后进行垃圾回收的中间字符串。

编辑
注意mystring += "a"并不简单的添加“A”到以前的字符串。它为组合创建一个新的字符串,并将“mystring”指向它,从而丢弃以前的值(如果没有更多的引用)。

编辑完

,如果你做的每个单独行一个StringBuilder追加后面是的ToString一系列

string mystring = "something"; 
mystring += "something else"; 
mystring = mystring + "third"; 

将执行速度较慢()来获得结果回来的字符串。如果您使用单个StringBuilder,重复执行Append()并最后执行.ToString(),则只会获得性能优势。

StringBuilder sb = new StringBuilder(); 
sb.Append("something"); 
sb.Append("something else"); 
sb.Append("third"); 
string mystring = sb.ToString(); 

然后一个StringBuilder有它自己的开销,所以如果你有少量的字符串部分加入它将不会使你受益。

注意,编译器在单个语句优化掉的连接:

string mystring = "something" + "something else" + "third"; 

是最快的。

5

原因很简单:

因为

string result = a + b; 

var sb = new StringBuilder(a, a.Length + b.Length); 
sb.Append(b); 
string result = sb.ToString(); 

StringBuilder更有效唯一让当很多级联的正在发生意义上,通常在一个循环中。