.NET字符串连接(+& + =)与StringBuilder

时间:2012-08-02 10:05:41

标签: .net string operators concatenation stringbuilder

我正在读一本名为.NET Gotchas的书(值得一读IMO),它说明了String和StringBuilder之间的性能差异,并提出了一个我觉得无法回答的问题!虽然我不知道任何一个类的内部(没有看这些类的反映版本),但我想知道;由于.NET中的运算符是可重载的,为什么Microsoft没有实现String类在内部使用StringBuilder并重载连接运算符以简单地在StringBuilder中调用.Append()?我猜是有一些潜在的原因导致为什么不是这样,如果是这样,为什么?

2 个答案:

答案 0 :(得分:6)

问题不在于字符串连接速度慢,而是重复连接会创建大量需要分配的中间字符串,以后再进行垃圾收集。

修改
请注意,mystring += "a"并非简单地添加" a"到上一个字符串。它为组合创建一个新字符串,并指向" mystring"它,从而丢弃以前的值(如果没有更多的引用)。

结束编辑

一系列

string mystring = "something";
mystring += "something else";
mystring = mystring + "third";
如果你将每个单独的行作为StringBuilder附加,然后使用.ToString()将结果返回到字符串中,

将执行得更慢。如果使用单个StringBuilder,重复追加()并在最后执行.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";

最快。

答案 1 :(得分:5)

原因很简单:

,因为

string result = a + b;

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

StringBuilder只有在发生大量连接时才有意义,通常在循环内。