【问题标题】:What are the disadvantages of using a StringBuilder?使用 StringBuilder 有什么缺点?
【发布时间】:2011-09-23 04:06:25
【问题描述】:

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

我的问题是,为什么 .NET 默认不使用 stringBuilder?与仅使用 String 相比,它肯定有一些缺点。谁能告诉我它们是什么?

我唯一能想到的可能是它是一个更重的对象,并且需要更多时间来实例化,所以如果你没有过多地更改字符串,这将覆盖 StringBuilder 的好处

【问题讨论】:

    标签: string .net-4.0 stringbuilder


    【解决方案1】:

    字符串是不可变的,以便以线程安全的方式进行操作。因为 StringBuilder 是可变的,所以它不是线程安全的。此外,您可以通过复制对字符串的引用而不是创建一个全新的对象来“复制”字符串。可变对象可以通过它们的任何引用进行更改,这很危险。

    【讨论】:

    • @Diego Sevilla OP 想知道为什么在可变 StringBuilder 上使用不可变字符串。线程安全是原因之一。
    • 看起来不错。线程安全是需要注意的。默认情况下使用 StringBuilder 会将其从“选择加入”可变性反转为“选择退出”可变性。
    • @Diego:如果您传递的是字符串生成器,而不是传递字符串,这将适用。
    • 我的意思是,这种情况下的设计选择不是由线程安全驱动的,而是为了效率,这是肯定的。线程安全可能是不可变字符串的副作用,但(恕我直言)不是Strings 不可变的驱动设计决策。
    • @Merlyn:但是你为什么会想到通过StringBuilders?注意名字! :) 这只是为了构建它们......
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2012-02-12
      • 2010-09-27
      • 2018-11-27
      相关资源
      最近更新 更多