使用StringBuilder的好处

4

可能是重复问题:
String vs StringBuilder

你好,

我正在创建一个json字符串。我有一些json编码器可以接收对象并返回json字符串。我想将这些字符串组装成一个长字符串。

使用字符串构建器和声明一个字符串并附加字符串之间有什么区别呢?

谢谢。


1
不要那样做。在最坏的情况下,使用string.Format()。甚至更好的方法是创建一个指定了你期望容纳的总长度的StringBuilder,并在那里开始附加字符串。尽可能指定总预期长度以避免后续内存分配。 - Adi
1
我在这个链接上找到了Jon Skeet的答案,它可能也对你有帮助:http://bytes.com/topic/c-sharp/answers/764258-stringbuilder-performance-questions - Mamta D
8个回答

14

在.NET中,字符串是不可变的。每次进行字符串追加时,都会创建一个新的对象。

而使用StringBuilder时,则是在预先分配的缓冲区中建立字符串。

也就是说,对于每个普通字符串的追加操作,都会创建一个新的对象,并复制所有字符。由于所有的临时字符串对象最终都需要进行垃圾回收,因此连接大量字符串可能会成为性能问题。因此,通常在动态追加大量字符串时使用StringBuilder是一个好主意。


3

字符串是不可变的,每次在追加字符串时都需要分配新的内存。

StringBuilder 允许您向对象添加字符,在需要使用字符串表示形式时,调用 ToString() 方法即可。


1

StringBuilder的工作方式类似于string.format(),比手动追加字符串或使用+更高效。使用+或手动追加会在内存中创建多个字符串对象。


0

复制。StringBuilder 每次不会创建字符串的新副本;据我所知,Append 方法只是将字节复制到预先分配的缓冲区中,而大部分情况下并不会重新分配新的字符串。这样做速度显著更快!我们在工作中一直在使用它。


0

string.Format使用StringBuilders。使用StringBuilder更优,因为您可以按照需要直接使用它,而无需Format()解释格式字符串中所有参数所需的开销。

想象一下,仅仅是string.Format()需要在格式化字符串中查找所有"{N}"序列...多了一项工作,是吧?


0

C# 中的字符串是不可变的,这使得连接字符串相对昂贵。 StringBuilder 通过创建缓冲区并将字符添加到缓冲区,在操作结束时将其转换为 string 来解决此问题。

在这里查看更多信息。


0
在 .NET Framework 中,每当您向现有字符串添加另一个字符串时,它都会创建一个全新的字符串实例。(过一段时间后,这将占用大量内存)
StringBuilder即使在您向其添加更多字符串时也使用单个实例。
这与性能有关。

0

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