可能重复:
String vs StringBuilder
您好,
我正在创建一个json字符串。我有一些json编码器接收对象并返回json字符串。我想将这些字符串组合成一个长字符串。
使用字符串构建器和声明字符串附加字符串之间有什么区别。
感谢。
答案 0 :(得分:11)
当你附加到字符串时,每次附加时都会创建一个新对象,因为字符串在.NET中是不可变的。
使用StringBuilder时,可以在预先分配的缓冲区中构建字符串。
也就是说,每个附加到普通字符串;您正在创建一个新对象并将所有字符复制到其中。因为所有小的(或大的)临时字符串对象最终都需要进行垃圾收集,所以将大量字符串附加在一起可能会导致性能问题。因此,在动态附加大量字符串时使用StringBuilder通常是个好主意。
答案 1 :(得分:3)
string是不可变的,每次附加字符串时都会分配新的内存。
StringBuilder允许您向对象添加字符,当您需要使用字符串表示时,可以在其上调用ToString()。
答案 2 :(得分:1)
StringBuilder的工作方式与string.format()
类似,并且比手动追加字符串或+
字符串更有效。使用+
或手动追加会在内存中创建多个字符串对象。
答案 3 :(得分:0)
份数。 stringbuilder每次都不会创建字符串的新副本; AFAIK Append只是在大多数时间将字节复制到预先分配的缓冲区而不是重新分配新字符串。它明显更快!我们一直在工作中使用它。
答案 4 :(得分:0)
string.Format正在使用StringBuilders。使用StringBuilder更为理想,因为您可以根据需要完全使用它,而不需要Format()需要在格式字符串中解释所有args的开销。
想象一下,string.Format()只需要在格式化字符串中找到所有“{N}”序列......这是一项额外的工作,是吗?
答案 5 :(得分:0)
字符串在C#中是不可变的。这使得附加字符串相对昂贵。 StringBuilder
通过创建缓冲区解决了这个问题,并且字符被添加到缓冲区并在操作结束时转换为string
。
查看here了解更多信息。
答案 6 :(得分:0)
在.NET Framework中,每次向现有字符串添加另一个字符串时,都会创建一个全新的字符串实例。 (这会在一段时间后占用大量内存)
即使您向其添加更多字符串,StringBuilder也会使用单个实例。
它与表现有关。
答案 7 :(得分:0)
String vs StringBuilder将帮助您理解String和StringBuilder之间的不同。