【问题标题】:is Capacity property of Stringbuilder really matters when we set its length to zero?当我们将 Stringbuilder 的长度设置为零时,Capacity 属性真的很重要吗?
【发布时间】:2014-01-20 22:15:16
【问题描述】:

我看到了这个问题

best-way-to-clear-contents-of-nets-stringbuilder/

回答者将长度设置为零并且还担心容量? 设置容量真的很重要吗?

如果我们反汇编 .net 4.5 Library,导航到 System.Text.StringBuilder

       /// <summary>
        /// Removes all characters from the current
 <see cref="T:System.Text.StringBuilder"/> instance.
        /// </summary>
        /// 
        /// <returns>
        /// An object whose <see cref="P:System.Text.StringBuilder.Length"/> 
        ///    is 0 (zero).

  /// </returns>
    [__DynamicallyInvokable]
    public StringBuilder Clear()
    {
      this.Length = 0;
      return this;
    }

当我们已经将它的长度设置为零时,设置容量真的很重要吗... 还是ms不在乎?

【问题讨论】:

  • 最常见且通常最好的方法是简单地放弃 StringBuilder 并创建一个新的。 Clear() 仅在您可以重复使用一个非常大的 (> 80 kB) 时才有用。
  • 旧 .NET 版本确实如此。不再适用于 4.0 及更高版本,它现在使用 ropes

标签: c# .net stringbuilder


【解决方案1】:

没有。在每天的代码中都没有关系。请注意,您链接到的堆栈专门解决了放弃该方法以支持 .net 4 实现的问题。

StringBuilder 的容量决定了底层缓冲区的初始大小。该缓冲区将根据需要扩展 - 我认为每次需要增长时它的容量都会翻倍。

StringBuilder.Length 跟踪有多少缓冲区是有效的(已分配) 数据。容量和长度是独立的。

Capacity 是一项优化功能。通过将容量归零,您所做的就是确保如果您将字符添加到StringBuilder 以换取立即回收该缓冲区,则将执行内存分配必须。这是一个经典的权衡。

您很少需要通过修改容量来使代码复杂化。

【讨论】:

  • 如果容量是一项优化功能。 ,为什么 ms 不会担心......或者他们是否提供其他方式来做同样的事情......
  • @vishalsharma MS 不要为您将其设置为零,因为它通常较慢 - 由于更多的内存分配。它可以使用,因为在某些情况下需要它;例如低内存设备。如果您需要使用它,请手动执行并明确 a) 您将容量归零和 b) 为什么您这样做了。
【解决方案2】:

这取决于您清除StringBuilder 的原因。

如果您重用StringBuilder,您可能会创建与前一个字符串长度大致相同的字符串。那么您想将Capacity 设置为零,因为您想保留当前缓冲区而不是分配新缓冲区。

如果您创建了一个非常长的字符串,并且即将创建具有相同StringBuilder 的更短的字符串,那么您希望将Capacity 设置为零以摆脱比您大得多的缓冲区需要。

【讨论】:

    【解决方案3】:

    在 Clear() 之后将容量设置为 0 的还有一个原因:重复使用 Insert() 和 Clear() 时,StringBuilder 会出现内存泄漏。即使有大量可用内存可供 Stringbuilder 使用,它也总是会为 Insert() 添加新内存,直到抛出 Out of Memory 异常。我通过演示程序向 Microsoft 报告了这个错误。请访问该链接并为该错误投票,以便 Microsoft 对其进行调查:

    https://connect.microsoft.com/VisualStudio/feedback/details/1242873

    详细解释见我的回答:

    Memory Leak in StringBuilder when using Insert() and Clear()

    请注意:将Capacity 设置为0 会破坏使用Clear() 重用StringBuilder 的目的,因为分配给StringBuilder 的所有内存都会丢失。我想使用新的 StringBuilder 差不多快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多