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

man*_*juv 5 .net c# string stringbuilder

在将字符串附加到a时StringBuilder,它的容量和长度是否可以超越它MaxCapacity

根据MSDN MaxCapacity定义为"字符串生成器实例可以容纳的最大字符数".但是这种行为在以下两个代码片段中不一致:

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

        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
Run Code Online (Sandbox Code Playgroud)

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

        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"
Run Code Online (Sandbox Code Playgroud)

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

Rez*_*aei 7

StringBuilder构造函数(Int32,Int32)


调用者的说明在.NET Framework 4和.NET Framework 4.5中,当您通过调用StringBuilder(Int32,Int32)构造函数实例化StringBuilder对象时,StringBuilder实例的长度和容量都可能超过其值MaxCapacity属性.当您调用Append和AppendFormat方法追加小字符串时,尤其会发生这种情况.

额外资源:

结论:

这个类有这样写性能方面的原因,并在官方文件称,其CapacityLength能增长超过它的MaxCapacity特别追加,当小弦.此外,正如文档中所述,一些默认值是 implementation-specific,所以看起来你最好不要依赖CapacityMaxCapacity,并且出于性能原因只使用这个类这些条件:

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