2015-09-07 26 views
5

文字列をStringBuilderに追加すると、その容量と長さはMaxCapacity以上になりますか?StringBuilder:StringBuilderの長さと容量がMaxCapacityを超えてもかまいません

MSDNによると、MaxCapacityは「文字列ビルダーインスタンスが保持できる最大文字数」として定義されています。しかし、この現象は、2つのコードスニペット以下に矛盾して:

スニペット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 

スニペット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" 

誰もがこれらの2つのケースで起こっていただきましたを説明してください、なぜ行動の違いがあることはできますか?呼び出し側へ

+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);'を試してみると、2番目のサンプルがスローされます。 –

答えて

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

関連する問題