Top > .NET & Control > StringBuilderクラス

StringBuilderクラス

StringBuilder クラス は、可変長の文字列を扱い場合に最適です。

Stringクラスは、同じ文字列変数に違う文字列を代入すると、その都度新なた文字列インスタンスを作成します。そのため、頻繁に内容を変更する場合、処理に時間がかかってしまうという欠点があります。

まとめ

初期化された文字列インスタンスに対して、追加、挿入、部分削除などを行う際は、是非検討した方がいいです。

例えば、HTMLテキストを読み込み文字列のインスタンスを作成。そのインスタンスに対して、挿入、追加、置き換え、部分削除などの操作を行う。など

代入の場合は、どちらも早くStringで問題ありません。状況によってはStringBuilderクラスの方が遅い場合もあります。

StringBuilderクラスはStringクラスほど高機能ではありません。検索機能も持っていません。用途によって使い分けることをお勧めします。

改行付きの文字列を追加する際、AppendLineメソッドを使用すると便利です。

メソッド

StringBuilder コンストラクタ
Append 文字列追加
AppendFormat 文字列追加(書式付き文字列)
AppendLine 末尾に既定行終端記号を追加
CopyTo 指定文字からChar配列(指定位置より)へ指定文字数分コピー
EnsureCapacity  容量を指定値以上に設定
Equals 指定オブジェクトに等しいかどうかを判定
Insert 文字列の挿入
Remove 指定範囲の文字を削除
Replace 検索文字(列)を指定文字(列)に置換(範囲指定可)
GetHashCode ハッシュ値は、Stringとは異なります。

プロパティ

Capacity 格納可能な最大文字数の取得/変更Chars 指定文字位置の文字の取得/変更Length 文字長の取得/変更MaxCapacity 最大容量の取得 

StringBuilderクラスの実験

●実験1.文字列の代入処理時間

○string
 string str = "";
 for (int i = 0; i < 60000; i++){ str = i.ToString(); }

○StringBuilder
 sb = new System.Text.StringBuilder();
 for (int i = 0; i < 60000; i++) {
  sb.Remove(0, sb.Length);
  sb.Append(i.ToString()); }

結果は、MyPCで、16ms前後。StringBuilderは32msの時も有りStringBuilderの代入は、コンストラクタによる初期化か上記の様に削除して追加するという方法しかありません。

●実験2.文字列の追加処理時間

○string
 for (int i = 0; i < 60000; i++){ str = i.ToString(); }

○StringBuilder
 for (int i = 0; i < 60000; i++){ sb.Append(i.ToString()); }

結果は、String 27300ms、StringBuilder 31msでした。
 StringBuilderは、Stringの約880倍の高速性能でした。

●実験3.文字列の挿入処理時間

○string
 for (int i = 0; i < 60000; i++)
  { str = str.Insert(0, i.ToString()); }

○StringBuilder
 for (int i = 0; i < 60000; i++)
  { sb.Insert(0, i.ToString()); }

結果は、String 26255ms、StringBuilder 13010msでした。
 StringBuilderは、Stringの約2倍の性能です。
StringのInsert()メソッドは、インスタンスに対して操作するのではなく、挿入した結果を返すだけです。内容は変わらないので注意してください。

●実験4.改行付き文字列の追加と結果

以下のコードを実行すると

sb.AppendLine("Hello");
 sb.AppendLine("World");
 sb.AppendLine();
 sb.AppendLine("123");
 sb.AppendLine((string)null);
 結果は 以下の通りです。
 "Hello\r\nWorld\r\n\r\n123\r\n\r\n"

\r\nは、既定行終端記号のことです。テキストの改行はこのコードを終端として判断します。

●他のメソッドの使用例

StringBuilder sb = new StringBuilder("ABC", 50);

sb.Append(new char[] { 'D', 'E', 'F' });
 sb.AppendFormat("GHI{0}{1}", 'J', 'k');
 sb.Insert(0, "Alphabet: ");
 sb.Replace('k', 'K');
 sb.Length;
 sb.ToString();

実際に試して確認してください。

▲ページトップに戻る