【问题标题】:.NET String concatenation (+ & +=) vs. StringBuilder.NET 字符串连接 (+ & +=) 与 StringBuilder
【发布时间】:2012-08-02 10:05:41
【问题描述】:
我正在阅读一本名为 .NET Gotchas 的书(非常值得一读 IMO),它说明了 String 和 StringBuilder 之间的性能差异,它提出了一个我觉得无法回答的问题!虽然我不知道这两个类的内部结构(没有查看这些类的反射版本),但我想知道;既然 .NET 中的运算符是可重载的,为什么微软没有实现 String 类在内部使用 StringBuilder 并重载串联运算符以简单地调用 StringBuilder 中的 .Append()?我猜有一些根本原因说明为什么不是这样,如果是这样,为什么?
【问题讨论】:
标签:
.net
string
operators
concatenation
stringbuilder
【解决方案1】:
问题不在于字符串连接速度慢,而更多的是重复连接会产生大量中间字符串,需要分配并随后进行垃圾回收。
编辑
请注意,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";
最快。
【解决方案2】:
原因很简单:
因为
string result = a + b;
比
更有效率
var sb = new StringBuilder(a, a.Length + b.Length);
sb.Append(b);
string result = sb.ToString();
StringBuilders 仅在发生大量串联时才有意义,通常在循环内。