C# Language
StringBuilder
Suche…
Was ist ein StringBuilder und wann wird er verwendet?
Ein StringBuilder
repräsentiert eine Reihe von Zeichen, die im Gegensatz zu einer normalen Zeichenfolge veränderbar sind. Oft müssen Strings, die wir bereits erstellt haben, geändert werden, das Standard-String-Objekt kann jedoch nicht geändert werden. Dies bedeutet, dass jedes Mal, wenn eine Zeichenfolge geändert wird, ein neues Zeichenfolgenobjekt erstellt, kopiert und erneut zugewiesen werden muss.
string myString = "Apples";
mystring += " are my favorite fruit";
Im obigen Beispiel hat myString
anfangs nur den Wert "Apples"
. Wenn wir jedoch "sind meine Lieblingsfrucht" verketten, muss die String-Klasse intern Folgendes tun:
- Erstellen eines neuen Array von Zeichen, das der Länge von
myString
und der neuen Zeichenfolge entspricht, die wir anhängen. - Kopieren Sie alle Zeichen von
myString
an den Anfang unseres neuen Arrays und die neue Zeichenfolge an das Ende des Arrays. - Erstellen Sie ein neues String-Objekt im Speicher und
myString
Sie es erneutmyString
.
Für eine einzelne Verkettung ist dies relativ trivial. Was aber, wenn nötig, um viele Anfügeoperationen in einer Schleife auszuführen?
String myString = "";
for (int i = 0; i < 10000; i++)
myString += " "; // puts 10,000 spaces into our string
Durch das wiederholte Kopieren und Erstellen von Objekten wird die Leistung unseres Programms erheblich beeinträchtigt. Wir können dies vermeiden, indem wir stattdessen einen StringBuilder
.
StringBuilder myStringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++)
myStringBuilder.Append(' ');
Wenn nun dieselbe Schleife ausgeführt wird, ist die Leistung und Geschwindigkeit der Ausführungszeit des Programms wesentlich schneller als bei Verwendung einer normalen Zeichenfolge. Um den StringBuilder
wieder in einen normalen String ToString()
, können Sie einfach die ToString()
Methode von StringBuilder
aufrufen.
Dies ist jedoch nicht die einzige Optimierung, die StringBuilder
bietet. Um die Funktionen weiter zu optimieren, können wir andere Eigenschaften nutzen, um die Leistung zu verbessern.
StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000
Wenn wir im Voraus wissen, wie lange unser StringBuilder
muss, können wir seine Größe vorab angeben, um zu verhindern, dass das Zeichen-Array intern geändert werden muss.
sb.Append('k', 2000);
Die Verwendung von StringBuilder
zum Anhängen ist zwar viel schneller als eine Zeichenfolge, kann jedoch noch schneller ausgeführt werden, wenn Sie nur ein einziges Zeichen oft hinzufügen müssen.
Sobald Sie Ihren Zeichenfolge Bau abgeschlossen haben, können Sie die Verwendung ToString()
Methode auf dem StringBuilder
es zu einer grundlegenden konvertieren string
. Dies ist häufig erforderlich, da die StringBuilder
Klasse nicht von string
erbt.
Zum Beispiel können Sie einen StringBuilder
, um einen string
zu erstellen:
string RepeatCharacterTimes(char character, int times)
{
StringBuilder builder = new StringBuilder("");
for (int counter = 0; counter < times; counter++)
{
//Append one instance of the character to the StringBuilder.
builder.Append(character);
}
//Convert the result to string and return it.
return builder.ToString();
}
Fazit: StringBuilder
sollte anstelle von string verwendet werden, wenn viele Änderungen an einer Zeichenfolge im Hinblick auf die Leistung vorgenommen werden müssen.
Verwenden Sie StringBuilder zum Erstellen von Zeichenfolgen aus einer großen Anzahl von Datensätzen
public string GetCustomerNamesCsv()
{
List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+
StringBuilder customerNamesCsv = new StringBuilder();
foreach (CustomerData record in customerDataRecords)
{
customerNamesCsv
.Append(record.LastName)
.Append(',')
.Append(record.FirstName)
.Append(Environment.NewLine);
}
return customerNamesCsv.ToString();
}