Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält Informationen zur Verbesserung der Zeichenfolgenverkettungsleistung in Visual C#.
Originalproduktversion: Visual C#
Ursprüngliche KB-Nummer: 306822
Zusammenfassung
In diesem Artikel werden die Vorteile der Verwendung der StringBuilder
Klasse gegenüber herkömmlichen Verkettungstechniken erläutert. Zeichenfolgen im Microsoft .NET Framework sind unveränderlich (d. h. der referenzierte Text ist nach der anfänglichen Zuordnung schreibgeschützt). Es bietet viele Leistungsvorteile und stellt dem Entwickler, der sich an C/C++-Zeichenfolgenmanipulationstechniken gewöhnt hat, einige Herausforderungen dar.
Dieser Artikel bezieht sich auf den .NET Framework-Klassenbibliotheksnamespace System.Text
.
Beschreibung von Zeichenfolgen im .NET Framework
Eine Technik zur Verbesserung der Zeichenfolgenverkettung strcat()
in Visual C/C++ besteht darin, ein großes Zeichenarray als Puffer zuzuweisen und Zeichenfolgendaten in den Puffer zu kopieren. In .NET Framework ist eine Zeichenfolge unveränderlich, sie kann nicht geändert werden. Der C# +
-Verkettungsoperator erstellt eine neue Zeichenfolge und verursacht eine reduzierte Leistung, wenn große Textmengen verkettet werden.
Das .NET Framework enthält jedoch eine StringBuilder
Klasse, die für die Zeichenfolgenverkettung optimiert ist. Es bietet dieselben Vorteile wie die Verwendung eines Zeichenarrays in C/C++, und das automatische Vergrößern der Puffergröße (falls erforderlich) und das Nachverfolgen der Länge für Sie. Die Beispielanwendung in diesem Artikel veranschaulicht die Verwendung der StringBuilder
Klasse und vergleicht die Leistung mit Verkettung.
Erstellen und Ausführen einer Demoanwendung
Starten Sie Visual Studio, und erstellen Sie dann eine neue Visual C#-Konsolenanwendung.
Im folgenden Code werden die
+=
Verkettungsoperatoren und dieStringBuilder
Klasse verwendet, um jeweils 5.000 Verkettungen von 30 Zeichen zu verwenden. Fügen Sie diesen Code zur Hauptprozedur hinzu.const int sLen = 30, Loops = 5000; int i; string sSource = new String('X', sLen); string sDest = ""; // Time string concatenation. var stopwatch = System.Diagnostics.Stopwatch.StartNew(); for (i = 0; i < Loops; i++) sDest += sSource; stopwatch.Stop(); Console.WriteLine($"Concatenation took {stopwatch.ElapsedMilliseconds} ms."); // Time StringBuilder. stopwatch.Restart(); System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1)); for (i = 0; i < Loops; i++) sb.Append(sSource); sDest = sb.ToString(); stopwatch.Stop(); Console.WriteLine($"String Builder took {stopwatch.ElapsedMilliseconds} ms."); // Make the console window stay open // so that you can see the results when running from the IDE. Console.WriteLine(); Console.Write("Press Enter to finish ... "); Console.Read();
Speichern Sie die Anwendung. Drücken Sie F5, um die Anwendung zu kompilieren und dann auszuführen. Die Konsolenfenster sollten die Ausgabe ähnlich wie in den Beispielen anzeigen:
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...
Drücken Sie die EINGABETASTE, um die Ausführung der Anwendung zu beenden und das Konsolenfenster zu schließen.
Problembehandlung
Wenn Sie sich in einer Umgebung befinden, die das Streamen der Daten unterstützt, z. B. in einem ASPX-Webformular oder in der Anwendung die Daten auf den Datenträger schreiben, sollten Sie den Pufferaufwand der Verkettung oder des
StringBuilder
Datenstroms vermeiden und die Daten direkt über dieResponse.Write
Methode oder die entsprechende Methode für den betreffenden Datenstrom in den Datenstrom schreiben.Versuchen Sie, das vorhandene
StringBuilder class
Zuverwenden, anstatt jedes Mal neu zu verwenden, wenn Sie eins benötigen. Dies begrenzt das Wachstum des Heaps und reduziert die Garbage Collection. In beiden Fällen macht die Verwendung derStringBuilder
Klasse den Heap effizienter als die Verwendung des+
Operators.
References
Die StringBuilder
Klasse enthält viele andere Methoden für die direkte Zeichenfolgenmanipulation, die in diesem Artikel nicht beschrieben werden. Weitere Informationen finden Sie StringBuilder
in der Onlinehilfe.