この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

StringBuilder クラス

 

公開日: 2016年10月

可変型の文字列を表します。 このクラスは継承できません。

この型の .NET Framework ソース コードを参照するを参照してください。、 Reference Sourceします。

名前空間:   System.Text
アセンブリ:  mscorlib (mscorlib.dll 内)

System.Object
  System.Text.StringBuilder

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable

名前説明
System_CAPS_pubmethodStringBuilder()

StringBuilder クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodStringBuilder(Int32)

指定した容量を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodStringBuilder(Int32, Int32)

指定した容量で始まり、指定した最大容量まで大きくなる StringBuilder クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodStringBuilder(String)

指定した文字列を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodStringBuilder(String, Int32)

指定した文字列および容量を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodStringBuilder(String, Int32, Int32, Int32)

指定した部分文字列および容量から StringBuilder クラスの新しいインスタンスを初期化します。

名前説明
System_CAPS_pubpropertyCapacity

現在のインスタンスによって割り当てられたメモリに格納できる最大文字数を取得または設定します。

System_CAPS_pubpropertyChars[Int32]

このインスタンス内の指定した文字位置の文字を取得または設定します。

System_CAPS_pubpropertyLength

現在の StringBuilder オブジェクトの長さを取得または設定します。

System_CAPS_pubpropertyMaxCapacity

このインスタンスの最大容量を取得します。

名前説明
System_CAPS_pubmethodAppend(Boolean)

指定したブール値の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Byte)

指定した 8 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Char)

指定した Char オブジェクトの文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Char*, Int32)

指定したアドレスで始まる Unicode 文字の配列をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Char, Int32)

Unicode 文字の文字列形式の、指定した数のコピーをこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Char[])

指定した配列内の Unicode 文字の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Char[], Int32, Int32)

Unicode 文字の指定した部分配列の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Decimal)

指定した 10 進数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Double)

指定した倍精度浮動小数点数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Int16)

指定した 16 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Int32)

指定した 32 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Int64)

指定した 64 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Object)

指定したオブジェクトの文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(SByte)

指定した 8 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(Single)

指定した単精度浮動小数点数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(String)

指定した文字列のコピーをこのインスタンスに追加します。

System_CAPS_pubmethodAppend(String, Int32, Int32)

指定した部分文字列のコピーをこのインスタンスに追加します。

System_CAPS_pubmethodAppend(UInt16)

指定した 16 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(UInt32)

指定された 32 ビット符号なし整数の文字列表記をこのインスタンスに追加します。

System_CAPS_pubmethodAppend(UInt64)

指定した 64 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、指定された書式プロバイダーを使用して単一の引数の文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、指定された書式プロバイダーを使用して 2 つの引数のいずれかの文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、指定された書式プロバイダーを使用して 3 つの引数のいずれかの文字列形式に置換されます。各書式項目は、指定された書式プロバイダーを使用して 3 つの引数のいずれかの文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object[])

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、指定された書式プロバイダーを使用した、パラメーター配列内の対応する引数の文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(String, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、単一の引数の文字列表記に置換されます。

System_CAPS_pubmethodAppendFormat(String, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、2 つの引数のどちらかの文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(String, Object, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、3 つの引数のいずれかの文字列形式に置換されます。

System_CAPS_pubmethodAppendFormat(String, Object[])

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに付加します。 各書式項目は、パラメーター配列内の対応する引数の文字列形式に置換されます。

System_CAPS_pubmethodAppendLine()

既定の行終端記号を現在の StringBuilder オブジェクトの末尾に追加します。

System_CAPS_pubmethodAppendLine(String)

指定した文字列のコピーと既定の行終端記号を、現在の StringBuilder オブジェクトの末尾に追加します。

System_CAPS_pubmethodClear()

現在の StringBuilder インスタンスからすべての文字を削除します。

System_CAPS_pubmethodCopyTo(Int32, Char[], Int32, Int32)

このインスタンスの指定したセグメントにある文字を、目的の Char 配列の指定したセグメントにコピーします。

System_CAPS_pubmethodEnsureCapacity(Int32)

このインスタンスの StringBuilder の容量が、指定した値以上になるようにします。

System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_pubmethodEquals(StringBuilder)

このインスタンスが指定されたオブジェクトに等しいかどうかを示す値を返します。

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_pubmethodInsert(Int32, Boolean)

Boolean 値の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Byte)

指定した 8 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Char)

指定した Unicode 文字の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Char[])

指定した Unicode 文字の配列の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Char[], Int32, Int32)

Unicode 文字の指定した部分配列の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Decimal)

10 進数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Double)

倍精度浮動小数点数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Int16)

指定した 16 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Int32)

指定した 32 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Int64)

64 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Object)

オブジェクトの文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, SByte)

指定した 8 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, Single)

単精度浮動小数点数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, String)

文字列をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, String, Int32)

指定した文字列の 1 つ以上のコピーをこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, UInt16)

16 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, UInt32)

32 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodInsert(Int32, UInt64)

64 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

System_CAPS_pubmethodRemove(Int32, Int32)

このインスタンスから、指定した範囲の文字を削除します。

System_CAPS_pubmethodReplace(Char, Char)

このインスタンスに出現する指定文字をすべて、別に指定した文字に置換します。

System_CAPS_pubmethodReplace(Char, Char, Int32, Int32)

このインスタンスの部分文字列に出現するすべての指定した文字を、別の指定した文字に置換します。

System_CAPS_pubmethodReplace(String, String)

このインスタンスに出現するすべての指定した文字列を、別の指定した文字列に置換します。

System_CAPS_pubmethodReplace(String, String, Int32, Int32)

このインスタンスの部分文字列に出現するすべての指定した文字列を、別の指定した文字列に置換します。

System_CAPS_pubmethodToString()

このインスタンスの値を String に変換します。(Object.ToString() をオーバーライドします。)

System_CAPS_pubmethodToString(Int32, Int32)

このインスタンスの部分文字列の値を String に変換します。

名前説明
System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable.GetObjectData(SerializationInfo, StreamingContext)

この API は 製品 インフラストラクチャをサポートします。コードから直接使用するためのものではありません。 System.Runtime.Serialization.SerializationInfo オブジェクトに、現在の StringBuilder オブジェクトの逆シリアル化に必要なデータを入力します。

System_CAPS_noteメモ

この型の .NET Framework ソース コードを参照してください、 Reference Sourceします。 ソース コードをオンラインで参照するか、リファレンスをダウンロードしてオフラインで表示するか、デバッグ中にソース (パッチや更新を含む) をステップ実行することができます。 instructionsを参照してください。

このクラスは、値が変更可能な一連の文字の文字列のようなオブジェクトを表します。

このセクションの内容:

StringBuilderString シーケンスを表す両方の文字の実装は異なります。 String 変更できない型です。 変更が、各操作は、 String オブジェクトが実際に新しい文字列を作成します。

たとえばを呼び出して、 String.Concat という名前の文字列変数の値を変更する次の c# の例ではメソッドが表示されます valueします。 実際には、 Concat メソッドが返される、 value 別の値とからアドレスを持つオブジェクト、 value メソッドに渡されたオブジェクト。 使用する例をコンパイルする必要があることに注意してください、 /unsafe コンパイラ オプション。

using System;

public class Example
{
   public unsafe static void Main()
   {
      string value = "This is the first sentence" + ".";
      fixed (char* start = value)
      {
         value = String.Concat(value, "This is the second sentence. ");
         fixed (char* current = value)
         {
            Console.WriteLine(start == current);
         }
      }   
   }
}
// The example displays the following output:
//      False

(何回もループ内で文字列を変更してアプリ) などの広範な文字列操作を行うルーチンでは、文字列を繰り返し変更が、大幅なパフォーマンスの低下に正確なことができます。 使用する方法、 StringBuilder, 、変更可能な文字列のクラスであります。 変更可能性は、クラスのインスタンスが作成されたら、変更できることを追加、削除、置換、または文字を挿入することを意味します。 A StringBuilder オブジェクトは、文字列の拡張に対応するためのバッファーを保持します。 ルームがある場合にバッファーに新しいデータが追加されます。それ以外の場合より大きなバッファーが割り当てられている、元のバッファーからのデータは新しいバッファーにコピーし、新しいデータは、新しいバッファーに追加されます。

System_CAPS_important重要

ですが、 StringBuilder クラスが通常よりも優れたパフォーマンスを提供、 String クラスを自動的には交換できません StringStringBuilder 文字列操作に必要な場合にします。 パフォーマンスは、新しい文字列、アプリが実行されて、システムおよび操作の種類に割り当てられるメモリの量、文字列のサイズによって異なります。 決定するアプリをテストする準備をしておく必要があるかどうか StringBuilder 実際に大幅なパフォーマンス向上を提供します。

使用を検討して、 String ような状況クラス。

  • 文字列にアプリケーションが加えた変更の数が小さい場合です。 このような場合は、 StringBuilder がごくわずかのプランまたは経由でパフォーマンスが向上しない Stringします。

  • ときに特にと文字列リテラルの連結操作の数を実行します。 この場合、コンパイラは、1 回の操作を連結演算を組み合わせることがあります。

  • ある場合、文字列を構築しているときに、包括的な検索操作を実行します。 StringBuilder クラスが不足しているメソッドのなど、検索 IndexOf または StartsWithです。 変換する必要があります、 StringBuilder オブジェクトを String を使用してパフォーマンス上の利点を無効にでき、これらの操作の StringBuilderです。 詳細については、次を参照してください。、 StringBuilder オブジェクトのテキストを検索 セクションです。

使用を検討して、 StringBuilder ような状況クラス。

  • 文字列に (たとえば、ユーザー入力を格納する文字列のランダムな数値を連結するループを使用している場合) のデザイン時に、不明な数の変更を加えるにアプリを予期したタイミングです。

  • 文字列に多数の変更を加えるにアプリを予期したタイミングです。

StringBuilder.Length プロパティは、文字数を示す、 StringBuilder オブジェクトが現在含まれています。 対象の文字を追加する場合、 StringBuilder オブジェクト、その長さのサイズと等しいしない限り増加する、 StringBuilder.Capacity オブジェクトに格納できる文字数を定義するプロパティです。 追加された文字数の長さが発生した場合、 StringBuilder をその現在の容量、新しいメモリを超えるオブジェクトは、割り当て済みの値、 Capacity プロパティが倍になり、新しい文字に追加され、 StringBuilder オブジェクト、およびその Length プロパティを調整します。 追加のメモリを StringBuilder によって定義された値に達するまででオブジェクトを動的に割り当て、 StringBuilder.MaxCapacity プロパティです。 最大容量に達すると、さらにメモリに割り当て可能なし、 StringBuilder オブジェクト、および文字を追加または最大の容量以上に拡張しようとしています。 をスローするか、 ArgumentOutOfRangeException または OutOfMemoryException 例外です。

次の例に示す方法、 StringBuilder オブジェクトが新しいメモリを割り当て、オブジェクトに割り当てられた文字列の拡張に伴い、その容量を動的に大きくなります。 します。 このコードを作成、 StringBuilder 既定 (パラメーターなし) コンス トラクターを呼び出すことによってオブジェクトです。 このオブジェクトの既定の容量は 16 文字で、容量が最大 20億を超える文字です。 「文はこの」文字列を追加 文字列の長さ (19 文字) は、既定の容量を超えているため、新しいメモリ割り当ての結果、 StringBuilder オブジェクトです。 オブジェクトの容量を 32 文字以内に 2 倍に、新しい文字列が追加され、オブジェクトの長さとに 19 文字を同じにするようになりました。 コード、文字列を追加「これは、追加の文です」です。 値に、 StringBuilder 11 回のオブジェクトします。 追加操作の長さが発生するたびに、 StringBuilder をその容量は、既存の容量を超えるオブジェクトが 2 倍になり、 Append 操作が成功しました。

using System;
using System.Reflection;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      ShowSBInfo(sb);
      sb.Append("This is a sentence.");
      ShowSBInfo(sb);
      for (int ctr = 0; ctr <= 10; ctr++) {
         sb.Append("This is an additional sentence.");
         ShowSBInfo(sb);
      }   
   }

   private static void ShowSBInfo(StringBuilder sb)
   {
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Capacity: 16    MaxCapacity: 2,147,483,647    Length: 0
//    Capacity: 32    MaxCapacity: 2,147,483,647    Length: 19
//    Capacity: 64    MaxCapacity: 2,147,483,647    Length: 50
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 81
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 112
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 143
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 174
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 205
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 236
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 267
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 298
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 329
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 360

既定の容量、 StringBuilder オブジェクトが 16 文字とその既定の最大容量は Int32.MaxValueです。 呼び出した場合、これらの既定値が使用される、 StringBuilder()StringBuilder(String) コンス トラクターです。

初期容量を明示的に定義することができます、 StringBuilder 次の方法でオブジェクト。

  • いずれかを呼び出すことによって、 StringBuilder を含むコンス トラクター、 capacity パラメーターは、オブジェクトを作成する場合。

  • 明示的に新しい値を割り当てることによって、 StringBuilder.Capacity プロパティを既存の展開 StringBuilder オブジェクトです。 プロパティが、新しい領域が、既存の容量またはより大きいより小さい場合に、例外をスローする、 StringBuilder オブジェクトの最大容量です。

  • 呼び出して、 StringBuilder.EnsureCapacity 新しい容量を持つメソッドです。 新しい容量をより大きくなければなりません、 StringBuilder オブジェクトの最大容量です。 代入とは異なり、 Capacity プロパティには、 EnsureCapacity 、例外をスローしない場合は、目的の新しい容量は、既存の容量より小さい。 この場合、メソッドの呼び出しは無効です。

文字列の長さが割り当てられている場合、 StringBuilder コンス トラクターの呼び出し内のオブジェクトは、既定の量、または指定した容量を超えています。、 Capacity プロパティで指定した文字列の長さに設定されて、 value パラメーター。

最大容量を明示的に定義することができます、 StringBuilder オブジェクトを呼び出して、 StringBuilder(Int32, Int32) コンス トラクターです。 新しい値を割り当てることによって最大容量を変更することはできません、 MaxCapacity プロパティには、読み取り専用であるためです。

前のセクションに示すように、既存の容量が不十分な追加のメモリが割り当てられているとの容量、 StringBuilder オブジェクトの倍精度小数点数で定義された値になるまで、 MaxCapacity プロパティです。

一般に、既定の量と最大容量が、ほとんどのアプリケーションに適してします。 次の条件下でこれらの値の設定を考慮することがあります。

  • 場合の最終的なサイズ、 StringBuilder オブジェクトは通常数メガ バイトを超える非常に大きくなる可能性があります。 ここである可能性がありますから、最初の設定のパフォーマンスが向上 Capacity プロパティを大幅に高の値が多すぎるのメモリ再割り当てが不要にします。

  • 場合は、アプリが制限されたメモリを搭載しています。 ことを検討が必要な場合は、 MaxCapacity プロパティをより小さい Int32.MaxValue 場合は、アプリケーションが、メモリの制約がある環境で実行する可能性のある長い文字列を処理します。

インスタンス化する、 StringBuilder その 6 つクラスをオーバー ロードされたコンス トラクターの次の表に示されているいずれかを呼び出してオブジェクトです。 コンス トラクターの 3 つのインスタンスを作成、 StringBuilder した空の文字列の値をオブジェクトに設定がその CapacityMaxCapacity が異なる値します。 残りの 3 つのコンス トラクターを定義、 StringBuilder 特定の文字列値と容量を持つオブジェクト。 既定の最大容量を使用して 3 つのコンス トラクターの 2 つ Int32.MaxValue, 、3 つ目では、最大容量を設定することができます。

コンストラクター

文字列値

キャパシティ

最大容量

StringBuilder()

String.Empty

16

Int32.MaxValue

StringBuilder(Int32)

String.Empty

定義される、 capacity パラメーター

Int32.MaxValue

StringBuilder(Int32, Int32)

String.Empty

定義される、 capacity パラメーター

定義される、 maxCapacity パラメーター

StringBuilder(String)

定義される、 value パラメーター

16 または valueです。 Length, 、大きい方

Int32.MaxValue

StringBuilder(String, Int32)

定義される、 value パラメーター

定義される、 capacity パラメーターまたは valueです。 Length, 、大きい方します。

Int32.MaxValue

StringBuilder(String, Int32, Int32, Int32)

定義される valueします。 Substring(startIndex, length)

定義される、 capacity パラメーターまたは valueです。 Length, 、大きい方します。

定義される、 maxCapacity パラメーター

次の例がこれらのコンス トラクター オーバー ロードのうち 3 つのインスタンスを作成するには StringBuilder オブジェクトです。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      string value = "An ordinary string";
      int index = value.IndexOf("An ") + 3;
      int capacity = 0xFFFF;

      // Instantiate a StringBuilder from a string.
      StringBuilder sb1 = new StringBuilder(value);
      ShowSBInfo(sb1); 

      // Instantiate a StringBuilder from string and define a capacity.  
      StringBuilder sb2 = new StringBuilder(value, capacity);   
      ShowSBInfo(sb2); 

      // Instantiate a StringBuilder from substring and define a capacity.  
      StringBuilder sb3 = new StringBuilder(value, index, 
                                            value.Length - index, 
                                            capacity );
      ShowSBInfo(sb3); 
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: An ordinary string
//    Capacity: 18    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: An ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 15

内の文字列を変更するメソッドのほとんどを StringBuilder インスタンスが同じインスタンスへの参照を返します。 これによりを呼び出すか StringBuilder 方法は 2 つのメソッド。

  • 個々 のメソッドを呼び出すことし、次の例では、戻り値を無視することができます。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder();
          sb.Append("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "");
          sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ");
          sb.Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    
  • 単一のステートメントでは、一連のメソッド呼び出しを行うことができます。 連続した操作が関連付けられている 1 つのステートメントを記述する場合に便利なことができます。 次の例では、次の 3 つのメソッド呼び出し、前の例を 1 行のコードに統合します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, 
                                                     "complete ").Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    

メソッドを使用する、 StringBuilder 反復処理する、追加、削除、または文字を変更するクラス、 StringBuilder オブジェクトです。

内の文字にアクセスすることができます、 StringBuilder オブジェクトを使用して、 StringBuilder.Chars プロパティです。 C# の場合、 Chars インデクサー; は、Visual basic での既定のプロパティでは、 StringBuilder クラスです。 これにより、設定するか明示的に参照しなくても、インデックスのみを使用して、個々 の文字を取得する、 Chars プロパティです。 内の文字、 StringBuilder オブジェクトのインデックスは 0 (ゼロ) から始まり、インデックスを引き続き Length - 1 です。

次の例を示しています、 Chars プロパティです。 10 個のランダムな数字を追加、 StringBuilder オブジェクト、および各文字を反復処理し、します。 文字の Unicode カテゴリの場合 UnicodeCategory.DecimalDigitNumber, 、1 で数を減らすこと (またはその値が 0 の場合、番号は 9 に変更)。 この例の内容を表示する、 StringBuilder 前に、と個々 の文字の値が変更された後にオブジェクトの両方です。

using System;
using System.Globalization;
using System.Text;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      StringBuilder sb = new StringBuilder();

      // Generate 10 random numbers and store them in a StringBuilder.
      for (int ctr = 0; ctr <= 9; ctr++)
         sb.Append(rnd.Next().ToString("N5"));    

      Console.WriteLine("The original string:");
      Console.WriteLine(sb.ToString());

      // Decrease each number by one.
      for (int ctr = 0; ctr < sb.Length; ctr++) {
         if (Char.GetUnicodeCategory(sb[ctr]) == UnicodeCategory.DecimalDigitNumber) {
            int number = (int) Char.GetNumericValue(sb[ctr]);
            number--;
            if (number < 0) number = 9;

            sb[ctr] = number.ToString()[0];
         }
      }
      Console.WriteLine("\nThe new string:");
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//    The original string:
//    1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
//    000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
//    .00000
//    
//    The new string:
//    0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
//    999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
//    .99999

StringBuilder クラスには内容を展開するには、以下の方法が含まれています、 StringBuilder オブジェクト。

  • Append メソッドを追加する文字配列の一部、文字列、部分文字列、文字配列、一文字複数回繰り返す、またはプリミティブ データの文字列形式を入力、 StringBuilder オブジェクトです。

  • AppendLine メソッドには、行終端記号またはに沿ってに行終端記号の文字列が追加され、 StringBuilder オブジェクトです。

  • AppendFormat メソッドを追加に、 StringBuilder オブジェクトです。 結果の文字列に含まれるオブジェクトの文字列形式には、現在のシステムのカルチャまたは指定されたカルチャの書式指定規則を反映できます。

  • Insert メソッドを挿入、文字列、部分文字列を複数回繰り返される、文字列の指定した位置にある文字の配列は、文字配列の一部またはプリミティブ データの文字列形式を入力、 StringBuilder オブジェクトです。 位置は、0 から始まるインデックスによって定義されます。

次の例では、 Append, 、AppendLine, 、AppendFormat, 、および Insert のテキストを展開する方法、 StringBuilder オブジェクトです。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      // Create a StringBuilder object with no text.
      StringBuilder sb = new StringBuilder();
      // Append some text.
      sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
      sb.AppendLine("\n");
      sb.AppendLine("Some code points and their corresponding characters:");
      // Append some formatted text.
      for (int ctr = 50; ctr <= 60; ctr++) {
         sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
         sb.AppendLine();
      }
      // Find the end of the introduction to the column.
      int pos = sb.ToString().IndexOf("characters:") + 11 + 
                Environment.NewLine.Length;
      // Insert a column header.
      sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", 
                                   "Character", "\n"));      

      // Convert the StringBuilder to a string and display it.      
      Console.WriteLine(sb.ToString());      
   }
}
// The example displays the following output:
//    ********** Adding Text to a StringBuilder Object **********
//    
//    Some code points and their corresponding characters:
//    
//       Code Unit    Character
//            0032            2
//            0033            3
//            0034            4
//            0035            5
//            0036            6
//            0037            7
//            0038            8
//            0039            9
//            003A            :
//            003B            ;
//            003C            <

StringBuilder クラスには、現在のサイズを削減できるメソッドが含まれています StringBuilder インスタンス。 Clear メソッドは、すべての文字を削除し、設定、 Length プロパティを 0 にします。 Remove メソッドは、特定のインデックス位置から始まる文字の指定した数を削除します。 末尾から文字を削除するさらに、 StringBuilder オブジェクトを設定してその Length プロパティを現在のインスタンスの長さより小さい値にします。

次の例では、削除からテキストの一部、 StringBuilder オブジェクト、その結果として得られる容量、最大容量は、および長さのプロパティの値を表示しを呼び出します、 Clear からすべての文字を削除する方法、 StringBuilder オブジェクトです。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder("A StringBuilder object");
      ShowSBInfo(sb);
      // Remove "object" from the text.
      string textToRemove = "object";
      int pos = sb.ToString().IndexOf(textToRemove);
      if (pos >= 0) {
         sb.Remove(pos, textToRemove.Length);
         ShowSBInfo(sb);
      }
      // Clear the StringBuilder contents.
      sb.Clear();
      ShowSBInfo(sb);   
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: A StringBuilder object
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 22
//    
//    Value: A StringBuilder
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 16
//    
//    Value:
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 0

StringBuilder.Replace メソッド、一文字または文字列全体で出現するすべての置換 StringBuilder オブジェクトまたは特定の文字範囲内です。 次の例では、 Replace に疑問符 (?) のすべての感嘆符 (!) するメソッド、 StringBuilder オブジェクトです。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
      MyStringBuilder.Replace('!', '?');
      Console.WriteLine(MyStringBuilder);
   }
}
// The example displays the following output:
//       Hello World?

StringBuilder クラスでは、ようなメソッドは含まれません、 String.Contains, 、String.IndexOf, 、および String.StartsWith によって提供されるメソッド、 String クラスは、特定の文字または部分文字列のオブジェクトを検索できます。 存在することを決定または部分文字列の文字位置を開始は、検索することが必要です、 String 文字列検索メソッドまたは正規表現メソッドを使用して値。 このような検索は、次の表に示すように実装する 4 つの方法があります。

手法

プロフェッショナル

短所

追加する前に文字列値を検索、 StringBuilder オブジェクトです。

部分文字列が存在するかどうかを確認するのに役立ちます。

部分文字列のインデックス位置が重要である場合は使用できません。

呼び出す ToString および返された検索 String オブジェクトです。

簡単に使用するすべてのテキストを割り当てる場合、 StringBuilder オブジェクト、および変更を開始します。

繰り返し呼び出す扱いにくい ToString かどうかは、変更をすべてのテキストが追加される前に、 StringBuilder オブジェクトです。

最後から作業することを忘れないでください、 StringBuilder 変更を加える場合、オブジェクトのテキスト。

使用して、 Chars 文字の範囲を順番に検索するプロパティです。

個々 の文字または小さな部分に問題がある場合に役立ちます。

検索する文字数が多い場合、または検索ロジックが複雑な場合は煩雑です。

変換、 StringBuilder オブジェクトを String に変更を行い、オブジェクトを String オブジェクトです。

変更の数が少ない場合に役立ちます。

パフォーマンス上の利点を否定、 StringBuilder クラスの変更の数が大きい場合。

これらの手法をさらに詳しく見ていきましょう。

  • 検索の目的に保存する前に文字列を検索することができます (つまり、部分文字列の位置に興味がない) 場合に特定の部分文字列が存在するかどうかを決定する場合、 StringBuilder オブジェクトです。 次の例では、1 つとして考えられる実装を提供します。 定義、 StringBuilderFinder クラスのコンス トラクターがへの参照を渡し、 StringBuilder オブジェクトと、文字列内で検索するサブスト リングします。 例が記録された温度が華氏または摂氏がありの先頭に適切な説明テキストを追加するかどうかを判断しようとした場合は、 StringBuilder オブジェクトです。 乱数ジェネレーターを使用して、摂氏または華氏のいずれかでデータを格納する配列を選択します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          Random rnd = new Random();
          string[] tempF = { "47.6F", "51.3F", "49.5F", "62.3F" };
          string[] tempC = { "21.2C", "16.1C", "23.5C", "22.9C" };
          string[][] temps = { tempF, tempC }; 
    
          StringBuilder sb = new StringBuilder();
          var f = new StringBuilderFinder(sb, "F");
          var baseDate = new DateTime(2013, 5, 1); 
          String[] temperatures = temps[rnd.Next(2)];
          bool isFahrenheit = false;
          foreach (var temperature in temperatures) {
             if (isFahrenheit)
                sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature);
             else
                isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}\n", 
                                                 baseDate, temperature));
             baseDate = baseDate.AddDays(1);
          }            
          if (isFahrenheit) {
             sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit");
             sb.Insert(47, "\n\n");
          }
          else {
             sb.Insert(0, "Average Daily Temperature in Degrees Celsius");
             sb.Insert(44, "\n\n");
          }   
          Console.WriteLine(sb.ToString());
       }
    }
    
    public class StringBuilderFinder
    {
       private StringBuilder sb;
       private String text;
    
       public StringBuilderFinder(StringBuilder sb, String textToFind)
       {
          this.sb = sb;
          this.text = textToFind;
       }
    
       public bool SearchAndAppend(String stringToSearch)
       {
          sb.Append(stringToSearch);
          return stringToSearch.Contains(text);
       }
    }
    // The example displays output similar to the following:
    //    Average Daily Temperature in Degrees Celsius
    //    
    //    5/1/2013: 21.2C
    //    5/2/2013: 16.1C
    //    5/3/2013: 23.5C
    //    5/4/2013: 22.9C
    
  • 呼び出す、 StringBuilder.ToString に変換する方法、 StringBuilder オブジェクトを String オブジェクトです。 などのメソッドを使用して、文字列を検索する String.LastIndexOf または String.StartsWith, 、正規表現を使用することも、 Regex パターンを検索するクラス。 両方 StringBuilderString オブジェクトは、utf-16 文字の部分文字列の文字のインデックス位置を格納するエンコーディングを使用して、正規表現の一致は、両方のオブジェクトで同じです。 これによりを使用して StringBuilder でそのテキストを検出する位置の同じ位置にある変更を加える方法、 String オブジェクトです。

    System_CAPS_noteメモ

    このアプローチを採用している場合は、最後から作業する必要があります、 StringBuilder オブジェクトを繰り返しに変換する必要があるないように、その開始するとき、 StringBuilder オブジェクトを文字列。

    このアプローチの例を次に示します。 英語のアルファベットの各文字の 4 つのオカレンスを格納、 StringBuilder オブジェクトです。 テキストを次に、変換、 String オブジェクトごとの 4 文字のシーケンスの開始位置を識別するために、正規表現を使用しています。 最後に、最初のシーケンスを除く各 4 文字のシーケンスの前にアンダー スコアを追加し、大文字に、シーケンスの最初の文字に変換します。

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Create a parallel string object.
          String sbString = sb.ToString();
          // Determine where each new character sequence begins.
          String pattern = @"(\w)\1+";
          MatchCollection matches = Regex.Matches(sbString, pattern);
    
          // Uppercase the first occurrence of the sequence, and separate it
          // from the previous sequence by an underscore character.
          for (int ctr = matches.Count - 1; ctr >= 0; ctr--) { 
             Match m = matches[ctr];
             sb[m.Index] = Char.ToUpper(sb[m.Index]);
             if (m.Index > 0) sb.Insert(m.Index, "_");
          }
          // Display the resulting string.
          sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • 使用して、 StringBuilder.Chars 内の文字の範囲を順番に検索するプロパティ、 StringBuilder オブジェクトです。 この方法は、検索する文字数が多いか、検索ロジックが特に複雑な場合は、実用的なできません。

    次の例では、前の例と同じ機能ですが、実装が異なります。 使用して、 Chars 文字の値が変更されたときを検出するためにプロパティが、その位置にアンダー スコアを挿入して、新しいシーケンスの最初の文字を大文字に変換します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort) 'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Iterate the text to determine when a new character sequence occurs.
          int position = 0;
          Char current = '\u0000';
          do {
             if (sb[position] != current) {
                current = sb[position];
                sb[position] = Char.ToUpper(sb[position]);
                if (position > 0) 
                   sb.Insert(position, "_");
                position += 2;
             }
             else {
                position++;
             }      
          } while (position <= sb.Length - 1);
          // Display the resulting string.
          String sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • 内のすべての変更されていないテキストを格納、 StringBuilder オブジェクトを呼び出す、 StringBuilder.ToString に変換する方法、 StringBuilder オブジェクトを String に変更を行い、オブジェクトを String オブジェクトです。 いくつか変更にのみがある場合は、この方法を使用することができます。それ以外の場合、変更できない文字列を操作のコストを使用するパフォーマンスの利点をなくなる場合があります、 StringBuilder オブジェクトです。

    次の例では、前の 2 つの例と同じ機能ですが、実装が異なります。 作成、 StringBuilder オブジェクトに変換する、 String オブジェクト、および正規表現を使用して、文字列の残りのすべての変更を実行します。 Regex.Replace(String, String, MatchEvaluator) メソッドでは、ラムダ式を使用して、一致した各文字列の置換を実行します。

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Convert it to a string.
          String sbString = sb.ToString();
    
          // Use a regex to uppercase the first occurrence of the sequence, 
          // and separate it from the previous sequence by an underscore.
          string pattern = @"(\w)(\1+)";
          sbString = Regex.Replace(sbString, pattern, 
                                   m => (m.Index > 0 ? "_" : "") + 
                                   m.Groups[1].Value.ToUpper() + 
                                   m.Groups[2].Value);
    
          // Display the resulting string.
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    

変換する必要があります、 StringBuilder オブジェクトを String オブジェクトで表される文字列を渡す前に、 StringBuilder オブジェクトを持つメソッドを String パラメーターまたはユーザー インターフェイスで表示します。 呼び出してこの変換を実行する、 StringBuilder.ToString メソッドです。 例については、呼び出しの前の例を参照してください、 ToString に変換する方法、 StringBuilder 文字列オブジェクトの正規表現メソッドに渡すことができるようにします。

呼び出し時の注意:

.NET Framework 4 と .NET Framework 4.5, をインスタンス化するときに、 StringBuilder オブジェクトを呼び出して、 StringBuilder(Int32, Int32) コンス トラクター、長さと容量の両方、 StringBuilder インスタンスは、の値を超えることができます、 MaxCapacity プロパティです。 これは特にを呼び出したときに発生、 AppendAppendFormat 短い文字列を追加する方法です。

次の例で定義されたメソッドの多くを呼び出す方法を示しています、 StringBuilder クラスです。

using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: