Die Arbeit mit Strings ist eine der häufigsten Aufgaben in Visual Basic. In der Geschichte der Sprache wurde der Typ String ursprünglich als ein bequemes veränderbares (mutable) Objekt konzipiert, wurde aber später als unveränderlich (immutable) implementiert, um die Zuverlässigkeit und Sicherheit bei mehrfacher Datenverarbeitung zu erhöhen. Das Hauptproblem besteht darin, dass bei jeder Verkettungsoperation, wenn Strings über + oder & hinzugefügt werden, ein neues Objekt erstellt wird – was die Leistung bei der Verarbeitung großer Textmengen, wie beispielsweise bei der Generierung von Berichten oder Logs, erheblich beeinträchtigt.
Die Lösung bestand darin, die spezielle Klasse StringBuilder zu verwenden, die es ermöglicht, Strings effizient „aufzubauen“, während überflüssige Speicherzuweisungen und Datenkopierungen minimiert werden. Intern speichert diese Klasse einen Puffer, der bei Bedarf dynamisch erweitert wird, und das Ergebnis kann mit einem Aufruf von ToString() abgerufen werden.
Beispielcode:
Dim sb As New System.Text.StringBuilder() For i As Integer = 1 To 10000 sb.Append("Line " & i & vbCrLf) Next dim result As String = sb.ToString()
Wichtige Besonderheiten:
String – Werte sind unveränderlich, jede Zuweisungsoperation erstellt einen neuen String im Speicher.StringBuilder – effizient für häufige Änderungen, geeignet für die Verkettung großer Datenmengen.+ oder & zu verbinden ist nur für kleine und seltene Operationen praktisch.Warum verhalten sich manchmal "+" und "&" unterschiedlich bei der Verkettung von Strings?
Der Operator + kann zu unerwarteten Typumwandlungen führen, wenn einer der Operanden eine Zahl oder einen anderen Typ ist. Der Operator & verkettet Strings strikt, selbst wenn der Operand kein String ist (er wird konvertiert).
Dim a As String = "5" Dim b As Integer = 10 Dim s1 = a + b ' Dies wird 15 ergeben aufgrund der Addition von Zahlen! Dim s2 = a & b ' Dies wird "510" sein, da eine Verkettung von Strings erfolgt
Kann StringBuilder langsamer sein als String?
Ja, für kleine Strings (zum Beispiel 2-3 Operationen) und seltene Änderungen kann StringBuilder überflüssig sein – in diesem Fall ist die gewöhnliche Verkettung in Bezug auf die Geschwindigkeit vergleichbar oder sogar schneller aufgrund der geringeren Speicherauslastung.
Kann ein String in Visual Basic an einem Index geändert werden?
Nein, Strings sind unveränderlich – man kann das Zeichen an einem Index nicht direkt ändern. Es muss ein neues Objekt erstellt werden:
Dim str As String = "test" str = str.Substring(0, 1) & "A" & str.Substring(2) ' Jetzt ist str = "tAst"
Im Projekt wurden große Tabellen von Aufzeichnungen zeilenweise mit dem Operator s = s & Line exportiert, wobei über 10.000 Iterationen durchgeführt wurden. Die Leistung fiel dramatisch mit großen Datenmengen.
Vorteile:
Nachteile:
Die Verkettung wurde durch StringBuilder ersetzt, der den gesamten Text sammelte und ihn nur einmal nach der Schleife in einen String umwandelte.
Vorteile:
Nachteile: