StringBuilder クラスの使用
String オブジェクトは不変オブジェクトです。System.String クラスのメソッドのいずれかを使用するたびに、メモリ内に新しい文字列オブジェクトを作成し、その文字列オブジェクトに対して新しい領域を割り当てる必要が生じます。文字列を何度も変更する必要がある場合は、新しい String オブジェクトの作成によって発生するオーバーヘッドが問題となることがあります。System.Text.StringBuilder クラスを使用すると、新しいオブジェクトを作成せずに文字列を変更できます。たとえば、ループ内で多数の文字列を連結する場合に、StringBuilder クラスを使用することでパフォーマンスを向上させることができます。
StringBuilder クラスの新しいインスタンスは、次の例で示すように、オーバーロードされたコンストラクタ メソッドで変数を初期化することによって作成できます。
Dim MyStringBuilder As New StringBuilder("Hello World!")
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
容量と長さの設定
StringBuilder は、それ自体がカプセル化する文字列内の文字数を増やすことのできる動的なオブジェクトですが、保持できる文字数の最大値を指定できます。この値はオブジェクトの容量と呼ばれ、現在の StringBuilder が保持している文字列の長さとは別の値です。たとえば、長さ 5 の文字列 "Hello" を含む StringBuilder クラスの新しいインスタンスを作成し、このオブジェクトの容量を 25 に指定したとします。この StringBuilder を変更した場合、指定した容量に達するまでは、そのサイズが再割り当てされることはありません。指定の容量に達した場合は、新しい領域が自動的に割り当てられ、容量が 2 倍になります。StringBuilder クラスの容量は、オーバーロードされたコンストラクタを使用して指定できます。MyStringBuilder
オブジェクトを最大 25 文字にまで拡張できるように指定する例を次に示します。
Dim MyStringBuilder As New StringBuilder("Hello World!", 25)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);
また、読み書き可能な Capacity プロパティを使用して、オブジェクトの最大長を指定することもできます。Capacity プロパティを使用してオブジェクトの最大長を定義する例を次に示します。
MyStringBuilder.Capacity = 25
MyStringBuilder.Capacity = 25;
EnsureCapacity メソッドを使用すると、現在の StringBuilder の容量を確認できます。渡された値よりも容量が大きい場合には容量は変更されませんが、渡された値よりも容量が小さい場合には、渡された値に一致するように容量が変更されます。
Length プロパティも参照または設定できます。Length プロパティを Capacity プロパティよりも大きい値に設定した場合、Capacity プロパティは自動的に Length プロパティと同じ値に変更されます。Length プロパティを現在の StringBuilder 内の文字列の長さよりも短い値に設定した場合は、文字列が切り詰められます。
StringBuilder の文字列の変更
StringBuilder の内容を変更するために使用できるメソッドを次の表に示します。
メソッド名 | 用途 |
---|---|
現在の StringBuilder の末尾に情報を追加します。 |
|
文字列で渡された書式指定子を書式指定済みのに置き換えます。 |
|
現在の StringBuilder の指定したインデックス位置に文字列またはオブジェクトを挿入します。 |
|
現在の StringBuilder から指定した数の文字を削除します。 |
|
指定したインデックス位置にある指定した文字を置換します。 |
Append
Append メソッドを使用すると、現在の StringBuilder によって表される文字列の末尾に、あるオブジェクトのテキスト表現または文字列表現を追加できます。StringBuilder を "Hello World" に初期化した後で、StringBuilder の末尾にテキストを追加する例を次に示します。必要に応じて空白が自動的に割り当てられます。
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Append(" What a beautiful day.")
Console.WriteLine(MyStringBuilder)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(MyStringBuilder);
この例は、コンソールに Hello World! What a beautiful day.
と出力します。
AppendFormat
AppendFormat メソッドは StringBuilder の末尾にテキストを追加しますが、それと同時に IFormattable インターフェイスも実装するため、書式指定のセクションで説明されている標準の書式指定文字列を使用できます。このメソッドを使用すると、変数の書式をカスタマイズして、変数の値を StringBuilder の末尾に追加できます。AppendFormat メソッドを使用して、通貨値として書式指定された整数値を StringBuilder の末尾に追加する例を次に示します。
Dim MyInt As Integer = 25
Dim MyStringBuilder As New StringBuilder("Your total is ")
MyStringBuilder.AppendFormat("{0:C} ", MyInt)
Console.WriteLine(MyStringBuilder)
int MyInt = 25;
StringBuilder MyStringBuilder = new StringBuilder("Your total is ");
MyStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(MyStringBuilder);
この例は、コンソールに Your total is $25.00
と出力します。
Insert
Insert メソッドは、現在の StringBuilder 内の指定した位置に文字列またはオブジェクトを追加します。このメソッドを使用して、StringBuilder の 6 番目のインデックス位置に単語を挿入する例を次に示します。
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(MyStringBuilder)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(MyStringBuilder);
この例は、コンソールに Hello Beautiful World!
と出力します。
Remove
Remove メソッドを使用すると、現在の StringBuilder の 0 から始まる指定したインデックス位置から指定数の文字を削除できます。Remove メソッドを使用して、StringBuilder の長さを短くする例を次に示します。
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Remove(5, 7)
Console.WriteLine(MyStringBuilder)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Remove(5,7);
Console.WriteLine(MyStringBuilder);
この例は、コンソールに Hello
と出力します。
Replace
Replace メソッドを使用すると、StringBuilder オブジェクト内の文字を、指定した別の文字に置き換えることができます。Replace メソッドを使用して、StringBuilder オブジェクト内のすべての感嘆符 (!) を検索して疑問符 (?) に置換する例を次に示します。
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(MyStringBuilder)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Replace('!', '?');
Console.WriteLine(MyStringBuilder);
この例は、コンソールに Hello World?
と出力します。