在将字符串附加到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"
任何人都可以解释在这两种情况下发生的事情,为什么行为有所不同?
答案 0 :(得分:7)
<强> StringBuilder Constructor (Int32, Int32) 强>
来电者须知
在.NET Framework 4和.NET Framework 4.5中,当您 通过调用实例化StringBuilder对象 StringBuilder(Int32,Int32)构造函数,长度和长度 StringBuilder实例的容量可以增长到超过的值 它的MaxCapacity属性。特别是在打电话时会发生这种情况 Append和AppendFormat方法附加小字符串。
其他资源:
StringBuilder
source code <强>结论:强>
由于性能原因,本课程采用了这种方式,正如官方文档中所述,Capacity
和Length
可以超出其MaxCapacity
,特别是在附加小字符串时。此外,如文档中所述,某些默认值为implementation-specific
,因此您最好不要依赖Capacity
和MaxCapacity
,并且出于性能原因仅使用此类这些条件: