【发布时间】: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