【问题标题】:StringBuilder : Can StringBuilder's length & capacity exceed its MaxCapacityStringBuilder : StringBuilder 的长度和容量能否超过其 MaxCapacity
【发布时间】:2015-09-07 06:38:52
【问题描述】:

在将字符串附加到StringBuilder 时,其容量和长度能否超出其MaxCapacity

根据 MSDN MaxCapacity 定义为“字符串构建器实例可以容纳的最大字符数”。但是这种行为在以下两个代码 sn-ps 中是不一致的:

片段 1: 在下面的代码中,当 StringBuilder 的长度超过其 MaxCapacity 时,会抛出 ArgumentOutOfRangeException - 这是预期的结果。

        String str = sb.ToString();

        StringBuilder sb1 = new StringBuilder(3, 5);
        sb1.Append("1");      //no error as Length 1 <= max limit 5         
        sb1.Append("12");     //no error as Length 3 <= max limit 5           
        sb1.Append("123");    //ArgumentOutOfRangeException Thrown as Length 6 > max limit 5

片段 2: 在下面的代码中,当 StringBuilder 的长度超过其 MaxCapacity 时,会抛出 NO ArgumentOutOfRangeException - 这种行为似乎不正确。

        StringBuilder sb = new StringBuilder(3, 5);

        sb.Append("1"); //no error as Length 1 <= max limit 5         
        sb.Append("2"); //no error as Length 2 <= max limit 5         
        sb.Append("3"); //no error as Length 3 <= max limit 5         
        sb.Append("4"); //no error as Length 4 <= max limit 5         
        sb.Append("5"); //no error as Length 5 <= max limit 5         
        sb.Append("6"); //Even though Length 6 > max limit 5 NO EXCEPTION IS THROWN         

        String str = sb.ToString(); //Contains "123456"

谁能解释在这两种情况下发生了什么以及为什么行为不同?

【问题讨论】:

  • StringBuilder 容量从 0 开始,而不是 1. 0 + "1" + "12" + "123" = 6
  • 有趣。如果您尝试StringBuilder sb = new StringBuilder(0, 5);,则会抛出第二个样本。
  • @Nikita - 没什么特别的。
  • @Gregg - 我试过 StringBuilder sb = new StringBuilder(3, 5); sb.Append("1"); sb.Append("21"); sb.Append("32"); sb.Append("4"); 没有抛出。

标签: c# .net string stringbuilder


【解决方案1】:

StringBuilder Constructor (Int32, Int32)

来电者须知
在 .NET Framework 4 和 .NET Framework 4.5 中,当您 通过调用实例化 StringBuilder 对象 StringBuilder(Int32, Int32) 构造函数,长度和 StringBuilder 实例的容量可以增长到超过 它的 MaxCapacity 属性。尤其是当您致电时,可能会发生这种情况 Append 和 AppendFormat 方法附​​加小字符串。

其他资源:

结论:

这个类是出于性能原因而编写的,正如官方文档中所述,它的CapacityLength 可以超出其MaxCapacity,特别是在附加小字符串时。此外,如文档中所述,一些默认值是implementation-specific,所以看起来你最好不要依赖CapacityMaxCapacity,并且仅出于性能原因在这些条件下使用此类:

  • 当您希望您的应用在设计时对字符串进行未知数量的更改时(例如,当您使用循环连接包含用户输入的随机数量的字符串时)。
  • 当您希望您的应用对字符串进行大量更改时。

【讨论】:

  • 我猜这在实践中意味着你可以附加到StringBuilder,只要当前的Length小于MaxCapacity。考虑到这是在版本 4 中进行的更改,这可能是有充分理由的。
  • @HenkHolterman 我认为开发人员看到了它的用例,否则他们不会添加它。
  • @Reza : 'MaxCapacity' 属性有什么特殊用途吗?是否有任何文件定义容量何时可以超过“MaxCapacity”以及何时不能?根据问题中给出的示例 - 行为是模棱两可的..在我尝试附加单个字符的字符串(并将 'Capacity' 增加到 'MaxCapacity' 之外)的一种情况下,不会引发异常,但在在其他情况下,我尝试附加一个带有两个/更多字符的字符串,则会引发异常。
  • 我猜想这样做是出于性能原因(StringBuilder 的存在是为了避免更改不可变字符串对性能造成的影响)。这不是真正的世界末日,不是吗?行为记录在案;如果您准备好捕获异常,那么检查长度会更有效。
【解决方案2】:

Microsoft Document

当达到最大容量时,无法为 StringBuilder 对象分配更多内存,并且尝试添加字符或将其扩展超出其最大容量会引发 ArgumentOutOfRangeException 或 OutOfMemoryException 异常。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多