StringBuilderクラスでは、常に文字列の実際の長さ以上のバッファが確保されています。 Capacityプロパティは現在のバッファのサイズ(容量)を取得するためのプロパティです。 このプロパティを設定することでバッファのサイズを変更することもできます。 ただし、当然現在の文字列の長さ未満にすることはできません。 この場合、例外ArgumentOutOfRangeExceptionがスローされます。
また、EnsureCapacityメソッドでもバッファのサイズを変更することができます。 このメソッドは、容量を減らすためではなく、現在の容量よりも多く確保したい場合に使用します。 EnsureCapacityメソッドでバッファを確保する場合、実際に確保される容量が指定した容量よりも大きくなる場合があります。 つまり、 最小でもメソッドで指定したサイズが確保されます。
StringBuilderのコンストラクタでも容量の初期値を指定してインスタンスを生成することができます(指定しない場合は初期値16でバッファが確保されます)。 StringBuilderに追加しようとする文字列の量をあらかじめ予測出来る場合は、あらかじめ適切な容量のバッファを確保しておくことでバッファ確保によるオーバーヘッドを減らすことが出来ます。
StringBuilderでバッファの容量を取得・変更する
Imports System
Imports System.Text
Class Sample
Shared Sub Main()
' 容量8のバッファを確保してインスタンスを作成
Dim sb As New StringBuilder(8)
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' バッファのサイズを超える長さの文字列を追加
sb.Append("The quick brown fox")
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' 容量を現在の長さの3/2(1.5倍)にする
sb.Capacity = (sb.Length * 3) \ 2
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' 文字列を追加
sb.Append(" jumps over the lazy dog")
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' 容量を現在の長さまで減らす
sb.Capacity = sb.Length
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' 最小で100の容量を確保する
sb.EnsureCapacity(100)
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
' 文字列を追加
sb.Append(" The quick brown fox jumps over the lazy dog")
Console.WriteLine("(Length={1}, Capacity={2}) <{0}>", sb, sb.Length, sb.Capacity)
End Sub
End Class
実行結果
(Length=0, Capacity=8) <> (Length=19, Capacity=19) <The quick brown fox> (Length=19, Capacity=38) <The quick brown fox> (Length=43, Capacity=43) <The quick brown fox jumps over the lazy dog> (Length=43, Capacity=43) <The quick brown fox jumps over the lazy dog> (Length=43, Capacity=100) <The quick brown fox jumps over the lazy dog> (Length=87, Capacity=100) <The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog>