StringBuilder如何决定其容量应该有多大?

Nic*_*ick 4 c# clr

我知道当sb已经处于容量状态时,当你使用sb.Append(..)时,StringBuilder对象会分配更多的内存.但是这个容量增加了多少?

    StringBuilder sb = new StringBuilder(5);
    sb.Append("0123456789");
Run Code Online (Sandbox Code Playgroud)

现在,某人的能力是什么?为什么?乘数是多少?

为了清楚起见.我问的是容量而不是长度.

谢谢!

Mar*_*ers 7

除了一些特殊情况,每次容量增加一倍:

  • 如果加倍不够,则容量进一步增加到所需的精确量.
  • 有一个上限 - 0x7fffffff.

您可以使用.NET Reflector或下载参考源来查看算法.

我无法发布官方.NET实现的源代码,但这里是Mono实现的代码:

// Try double buffer, if that doesn't work, set the length as capacity
if (size > capacity) {

    // The first time a string is appended, we just set _cached_str
    // and _str to it. This allows us to do some optimizations.
    // Below, we take this into account.
    if ((object) _cached_str == (object) _str && capacity < constDefaultCapacity)
        capacity = constDefaultCapacity;

    capacity = capacity << 1;  // This means "capacity *= 2;"

    if (size > capacity)
        capacity = size;

    if (capacity >= Int32.MaxValue || capacity < 0)
        capacity = Int32.MaxValue;

    if (capacity > _maxCapacity && size <= _maxCapacity)
        capacity = _maxCapacity;
}
Run Code Online (Sandbox Code Playgroud)

我还建议您不要编写依赖于此特定算法的代码,因为它是一个实现细节,而不是接口保证的东西.

  • @Mark:请不要发布使用Reflector获得的框架代码.除了这是侵犯版权之外,对于我们这些在其他.NET运行时工作的人来说,这是一个问题,需要[清洁室重新实现](http://www.mono-project.com/Contributing). (2认同)
  • @cdhowie并不意味着厚脸皮,但我发布了一个问题.不久前发布框架代码.你有一些有趣的想法,也许你想加入它?http://stackoverflow.com/questions/3109357/is-it-legal-to-make-code-decompiled-from-net-libraries-publicly-available (2认同)