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)
任何人都可以解释在这两种情况下发生的事情,为什么行为的差异?
StringBuilder构造函数(Int32,Int32)
对
调用者的说明在.NET Framework 4和.NET Framework 4.5中,当您通过调用StringBuilder(Int32,Int32)构造函数实例化StringBuilder对象时,StringBuilder实例的长度和容量都可能超过其值MaxCapacity属性.当您调用Append和AppendFormat方法追加小字符串时,尤其会发生这种情况.
额外资源:
StringBuilder 源代码结论:
这个类有这样写性能方面的原因,并在官方文件称,其Capacity与Length能增长超过它的MaxCapacity特别追加,当小弦.此外,正如文档中所述,一些默认值是 implementation-specific,所以看起来你最好不要依赖Capacity和MaxCapacity,并且出于性能原因只使用这个类这些条件:
| 归档时间: |
|
| 查看次数: |
5315 次 |
| 最近记录: |