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