2011-03-31 128 views
4

为什么我会使用StringBuilder而不是简单追加字符串?例如,为什么实现诸如:StringBuilder解决什么问题?

StringBuilder sb = new StringBuilder; 
sb.Append("A string"); 
sb.Append("Another string"); 

String first = "A string"; 
first += "Another string"; 

+1

见http://www.yoda.arachsys.com/csharp/stringbuilder.html – 2011-03-31 11:12:27

+0

这是一个真正的内存使用效率(与性能优势)追加大量字符串的方式在一起,无需花费很多的对象。 (更少的对象〜垃圾收集器所需的时间更少) – st0le 2011-03-31 11:13:59

+3

在循环之外,这不是什么大问题,因为编译器可能会将其优化为“String first =”一个字符串另一个字符串“;”一个字符串。其他人似乎已经说明了不要在循环中使用它的原因。 – BenCr 2011-03-31 11:15:51

回答

10

StringBuilder的文档解释其目的:

String对象是不可变的。每当您使用 System.String类中的某个方法时,您在内存中创建一个新的 字符串对象,其中 需要为新对象 指定一个新的空间分配。在 您需要执行重复 修改字符串的情况下,与创建 新的String对象相关的 开销可能是昂贵的。该 System.Text.StringBuilder类可用于 当你想修改字符串 而无需创建一个新的对象。对于 例如,使用StringBuilder类 可以提高性能时 在 一个循环中将许多字符串连接在一起。

5

在像你这样的简单情况下,它确实没有关系。但通常情况下,字符串是不可变的,这意味着每次对字符串变量的更改都会在内存中创建一个新的缓冲区,复制新的数据并放弃旧的缓冲区。如果你正在做大量的字符串操作,这会减慢程序速度,并导致很多被遗弃的字符串缓冲区,这些缓冲区需要被垃圾收集器收集。

0

的StringBuilder是可变的。字符串不是。所以对字符串的任何操作都会创建一个新对象。在第二个示例中,创建了2个对象(每行一个)。而在第一个中,只有一个对象被创建。

+2

没错。但实际上,如果你不需要做大量的字符串操作,String和StringBuilder的性能几乎相同,并且在短字符串和少量附加字符的情况下,简单字符串的效果会更好。 – 2011-03-31 12:01:27