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 erneut myString .

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();
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow