.NET String concatenation (+ & +=) vs. StringBuilder



我正在读一本名为.NET Gotchas的书(非常值得一读IMO),它说明了String和StringBuilder之间的性能差异,它提出了一个我觉得无法回答的问题!虽然我不知道这两个类的内部结构(没有查看这些类的反射版本),但我想知道;既然.NET中的运算符是可重载的,为什么Microsoft没有实现String类在内部使用StringBuilder,并重载串联运算符以在StringBuilder中简单地调用.Append()?我猜有一些根本原因可以解释为什么不是这样,如果是这样,为什么?

问题不在于字符串串接速度慢,而在于重复串接会产生大量中间字符串,这些字符串需要分配,然后进行垃圾收集。

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

结束编辑

系列

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

如果将每个单独的行作为StringBuilderAppend,然后用.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";

是最快的。

原因很简单:

因为

string result = a + b;

比更有效率

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

StringBuilder只有在发生大量串联时才有意义,通常在循环中。

最新更新