StringBuilder:StringBuilder的长度和长度可以容量超过其MaxCapacity

时间:2015-09-07 06:38:53

标签: c# .net string stringbuilder

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

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

代码段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"

任何人都可以解释在这两种情况下发生的事情,为什么行为有所不同?

1 个答案:

答案 0 :(得分:7)

<强> StringBuilder Constructor (Int32, Int32)

  

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

其他资源:

<强>结论:

由于性能原因,本课程采用了这种方式,正如官方文档中所述,CapacityLength可以超出其MaxCapacity,特别是在附加小字符串时。此外,如文档中所述,某些默认值为implementation-specific,因此您最好不要依赖CapacityMaxCapacity,并且出于性能原因仅使用此类这些条件:

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