使用StringBuilder的缺点是什么?

使用StringBuilder的缺点是什么?,string,.net-4.0,stringbuilder,String,.net 4.0,Stringbuilder,我知道,在处理大量修改字符串值的代码时,StringBuilder比普通字符串更高效,因为尽管字符串的行为类似于值类型,但它们实际上是引用,这使得它们不可变,因此每次更改它时,我们都需要在内存中创建一个新的引用 我的问题是,为什么.NET在默认情况下不使用stringBuilder呢?与仅仅使用字符串相比,它肯定有一些缺点。有人能告诉我它们是什么吗 我能想到的唯一一件事是,它可能是一个更重的对象,实例化需要更多的时间,因此,如果您没有对字符串进行太多更改,这将覆盖StringBuilder的好处

我知道,在处理大量修改字符串值的代码时,StringBuilder比普通字符串更高效,因为尽管字符串的行为类似于值类型,但它们实际上是引用,这使得它们不可变,因此每次更改它时,我们都需要在内存中创建一个新的引用

我的问题是,为什么.NET在默认情况下不使用stringBuilder呢?与仅仅使用字符串相比,它肯定有一些缺点。有人能告诉我它们是什么吗


我能想到的唯一一件事是,它可能是一个更重的对象,实例化需要更多的时间,因此,如果您没有对字符串进行太多更改,这将覆盖StringBuilder的好处。字符串是不可变的,以便以线程安全的方式进行操作。因为StringBuilder是可变的,所以它不是线程安全的。此外,您可以通过复制对字符串的引用而不是创建一个全新的对象来“复制”字符串。可变对象可以通过它们的任何引用进行更改,这很危险。

可能只是一个不太好的模式(必须创建另一个对象,然后使用
toString()
方法来实际获取
字符串
)。还要注意的是,由于
+
字符串的
运算符是特殊的,编译器可以在内部优化字符串副本,因此在.NET中可能没有实际开销。

@Diego Sevilla OP想知道为什么要在可变StringBuilder上使用不可变字符串。线程安全是原因之一。看起来没问题。线程安全是需要注意的。默认情况下使用StringBuilder会将其从“选择加入”易变性反转为“选择退出”易变性。@Diego:如果您传递的是字符串生成器,而不是字符串,则适用此方法。我的意思是,在这种情况下,设计选择不是由线程安全性驱动的,而是为了效率,这是肯定的。线程安全可能是不可变字符串的副作用,但(IMHO)并不是驱动
String
s成为不可变字符串的设计决策。@Merlyn:但是为什么要考虑传递
StringBuilder
s呢?注意名字!:)只是为了建造它们。。。