2015-09-07 1744 views
5

將字符串附加到StringBuilder時,其容量和長度是否會超出其MaxCapacityStringBuilder: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: 在下面的代碼NO ArgumentOutOfRangeException當StringBuilder的長度超過其MAXCAPACITY被拋出 - 該行爲似乎是不正確的。

 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

檢查此鏈接:https://msdn.microsoft。com/en-us/library/system.text.stringbuilder.maxcapacity(v = vs.110).aspx –

+0

StringBuilder的容量從0開始不爲1. 0 +「1」+「12」+「123」= 6 – Gregg

+0

有趣。如果你嘗試'StringBuilder sb = new StringBuilder(0,5);',則會拋出第二個示例。 –

回答

7

StringBuilder Constructor (Int32, Int32)

註釋呼叫者
在.NET Framework 4和.NET Framework 4.5,當你 通過調用 StringBuilder的(的Int32,Int32)將實例化StringBuilder對象構造函數中,StringBuilder實例的長度和容量都可以增長到其MaxCapacity屬性的值 以上。這可能會發生特別是當您調用 Append和AppendFormat方法來附加小字符串。

其他資源:

結論看一看:

此類已這樣寫性能方面的原因,併爲在官方文件中指出,其爲CapacityLength可以增長超出其MaxCapacity,特別是在附加小字符串時。此外,如文件中所述,一些默認值是implementation-specific,所以它似乎你最好不要依賴CapacityMaxCapacity,並且只使用這個類爲性能原因,這些條件:

  • 如果你希望你的應用在設計時對字符串進行未知數量的更改(例如,當您使用循環連接包含用戶輸入的隨機數字符串時)。
  • 當您希望您的應用程序對字符串進行大量更改時。
+0

這很不好... – Rawling

+0

我猜這是什麼意思,在實踐中,只要當前的'Length'小於'MaxCapacity',你可以附加到'StringBuilder'。大概有一個很好的理由,因爲它是在版本4中做出的改變。 – jmcilhinney

+0

@HenkHolterman設置容量的最大值? – Rawling

相關問題