gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:11:19 24 4
gpt4 key购买 nike

我正在阅读一本名为.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com