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

标签 .net string operators concatenation stringbuilder

我正在阅读一本名为.NET Gotchas的书(非常值得一读IMO),该书说明了String和StringBuilder之间的性能差异,并提出了一个我认为无法解决的问题!虽然我不知道任何一个类的内部(不查看这些类的反射(reflect)版本),但我想知道;由于.NET中的运算符是可重载的,为什么Microsoft不实现String类以在内部使用StringBuilder并重载连接运算符以仅在StringBuilder中调用.Append()?我猜有一些根本原因可以说明为什么不是这种情况,如果是这样,为什么?

最佳答案

问题不只是字符串连接缓慢,而更多的是重复连接会创建很多中间字符串,这些中间字符串需要分配并随后进行垃圾回收。

编辑
请注意,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";

最快。

关于.NET字符串串联(+&+ =)与StringBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775249/

相关文章:

linux - 如何用引号替换尖括号

c++ - c++ 中的字符减法

c++ - 在 C++ 中使用 "+"连接字符串

c++ - 运算符方法是否占用 C++ 对象中的内存?

时间:2019-03-08 标签:c#linqwhereconditionalif

c# - CngKey.Import(...);在 PC 上成功但在 Web 主机上失败

c# - 覆盖ToString()以进行调试和记录-字符串是否应该本地化?

java - 如何将 string = "\t"转换为 char

c# - 如何在 ASP.net 中执行一次方法

ios - NSAttributedString绘图-多少行?