C#のStringBuilderクラスの目的は何ですか?
C#では、文字列は不変です。つまり、一度作成した文字列を変更することはできません。文字列を変更すると、変更を含む新しい文字列が返され、元の文字列はそのまま残ります。
string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc
StringBuilderクラスは、変更可能な文字列のようなオブジェクト、つまり可変の文字列を表します。不変の文字列を表す文字列型とは異なる方法で実装されます。
文字列オブジェクトを変更するとコピーが作成されるため、文字列オブジェクトを繰り返し変更すると、パフォーマンスが低下する可能性があります。小さな繰り返しの場合は無視できますが、大きなループの場合は重要になる可能性があります。 StringBuilderは、文字を追加、削除、置換、または挿入することにより、文字列を変更するための効率的な代替手段を提供します。
StringBuilderは、文字を保持するための内部バッファーを維持します。バッファに使用可能なスペースがある場合は、新しいデータを追加します。それ以外の場合は、新しいバッファを作成し、古いデータを新しいバッファにコピーしてから、データを追加します。
var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa
StringBuilderオブジェクトを作成するさまざまな方法は次のとおりです。
// Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
StringBuilderクラスには、オブジェクトが現在持っている文字数を示すLengthプロパティがあります。オブジェクトにさらに文字を追加すると、その長さは、オブジェクトが現在含めることができる文字の最大数を定義する容量に達するまで増加します。
追加された文字の数によって長さが現在の容量を超える場合、クラスは新しいメモリを割り当て、その容量を結合します。次に、新しい文字がオブジェクトに追加され、その長さプロパティが調整されます。
StringBuilderは、MaxCapacityプロパティの値に達するまで、動的にメモリを追加し続けます。その後、オブジェクトにそれ以上のメモリを割り当てることはできません。オブジェクトにさらにデータを追加しようとすると、ArgumentOutOfRangeExceptionまたはOutOfMemoryException例外がスローされます。
StringBuilderは、文字列を簡単に変更できるようにする次のメソッドを提供します。
-
追加 −指定されたオブジェクトの文字列表現をこのインスタンスに追加します。
-
AppendFormat −このインスタンスに、0個以上のフォーマット項目を含む複合フォーマット文字列の処理によって返された文字列を追加します。各フォーマット項目は、対応するオブジェクト引数の文字列表現に置き換えられます。
-
AppendJoin −各メンバー間に指定された区切り文字を使用して、提供されたオブジェクトの配列内の要素の文字列表現を連結し、その結果を文字列ビルダーの現在のインスタンスに追加します。
-
AppendLine −現在のStringBuilderオブジェクトの末尾にデフォルトのラインターミネータを追加します。
-
クリア −現在のStringBuilderインスタンスからすべての文字を削除します。
-
コピー先 −文字を宛先のcharspanまたはchar配列にコピーします。
-
EnsureCapacity −StringBuilderのこのインスタンスの容量が少なくとも指定された値であることを確認します。
-
等しい −このインスタンスと指定されたインスタンスの文字列、容量、およびMaxCapacityの値が等しい場合はtrueを返します。
-
GetChunks −文字のチャンクを反復処理するために使用できるオブジェクトを返します。
-
挿入 −指定されたオブジェクトの文字列表現をこのインスタンスの指定された文字位置に挿入します。
-
削除 −指定された範囲の文字をこのインスタンスから削除します。
-
交換 −このインスタンスで指定された文字または文字列のすべての出現箇所を、別の指定された文字または文字列に置き換えます。
-
ToString −現在のインスタンスを文字列に変換します。
例
using System; using System.Text; class Program{ static void Main(string[] args){ string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa // Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20); } }
出力
aaabbbccc aaadddccc aaaaaaaaaa
-
C#のHashtableクラスのIsReadOnlyプロパティとは何ですか?
HashtableクラスのIsReadOnlyプロパティは、Hashtableが読み取り専用かどうかを示す値を取得するために使用されます。 例 using System; using System.Collections; namespace Demo { class Program { static void Main(string[] args) { Hashtable ht = new Hashtable();
-
JavaのProcessクラスの目的は何ですか?
java.lang.Process オブジェクトのサブクラスです クラスであり、 exec()によって開始されるプロセスを記述できます。 ランタイムの方法 クラス。 プロセス オブジェクトはプロセスを制御し、それに関する情報を取得します。 Processクラスは抽象クラスであるため、インスタンス化できません。 Processクラスの重要なメソッドは、 destroy()、exitValue()、getErrorStream()、waitFor()、getInputStream()です。 およびgetOutputStream() 。 構文 public abstract class Proce