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

6
我正在阅读一本名为.NET Gotchas(我认为非常值得一读)的书,它展示了String和StringBuilder之间的性能差异,并引发了一个问题,我觉得这个问题不能不回答!虽然我不知道这两个类的内部情况(除非查看这些类的反射版本),但我想知道:由于.NET中的运算符是可重载的,为什么Microsoft没有实现String类以在内部使用StringBuilder并重载连接运算符以简单地调用StringBuilder中的.Append()方法呢?我猜想这背后有一些根本原因,如果是这样,为什么呢?
2个回答

7
问题不在于字符串拼接很慢,而是重复拼接会产生很多中间字符串需要分配内存,而后又需要进行垃圾回收。

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

结束编辑

一系列的

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

如果您使用StringBuilder Append然后跟随.ToString()将每个单独的行作为字符串返回,这样做会使性能变慢。只有在您使用单个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只有在大量的字符串连接操作,通常发生在循环内部时才有意义。


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