10.4 StringBuilder
Objekte der Klasse String sind unveränderlich, bei jeder Änderung wird ein neues Objekt generiert. Damit ist die Klasse ungeeignet, wenn Texte sehr oft geändert werden. Dafür besser geeignet ist die Klasse StringBuilder im Namensraum System.Text. Das folgende Codefragment zeigt einen Geschwindigkeitsvergleich bei häufigen Änderungen.
'...\Basisklassen\KlasseStringBuilder\Vergleich.vb |
Option Strict On Namespace Basisklassen Module Vergleich Sub Test() Dim t0 As Date = Now Dim ts, tb As Long Dim str As String = "" For i As Integer = 0 To 100000 : str += "." : Next ts = Now.Ticks – t0.Ticks t0 = Now Dim sb As New Text.StringBuilder() For i As Integer = 0 To 100000 : sb.Append(".") : Next tb = Now.Ticks – t0.Ticks Console.WriteLine("Verhältnis: {0}", ts / tb) Console.ReadLine() End Sub End Module End Namespace
Die Ausgabe zeigt, dass hier StringBuilder etwa 2000-mal schneller war:
Verhältnis: 1939
Die Klasse StringBuilder hat weniger Möglichkeiten als String. Insbesondere gibt es keine Methoden zur Auswertung oder Extraktion eines Teilstrings.
Hinweis |
Die Methode ToString liefert eine Kopie der Zeichen im StringBuilder-Objekt als String. |
10.4.1 Kapazität
Nicht immer wird der von einem StringBuilder-Objekt belegte Speicher voll ausgenutzt. Die Anzahl der in dem Objekt speicherbaren Zeichen ist die Kapazität, die gerade gespeicherten Zeichen bestimmen die Länge. Bei Bedarf wird die Kapazität automatisch angepasst und neuer Speicher reserviert (jeweils mindestens Verdopplung). Sie können sie auch festlegen, aber sie darf niemals kleiner als die Länge sein.
10.4.2 Konstruktoren
Im Konstruktor können Sie eine Initialisierungszeichenfolge und die Kapazität(en) festlegen, die keine Potenz von 2 sein müssen.
Public Sub New() Public Sub New(capacity As Integer) Public Sub New(value As String) Public Sub New(capacity As Integer, maxCapacity As Integer) Public Sub New(value As String, capacity As Integer) Public Sub New(value As String, startIndex As Integer, length As Integer, _ capacity As Integer) |
Bei Überschreitung der Maximalgröße wird die Ausnahme ArgumentOutOfRangeException ausgelöst.
10.4.3 Eigenschaften
Außer auf die Kapazitäten (aktuelle und maximale) und die Länge (gerade gespeicherte Zeichen) greift der Indexer auf einzelne Buchstaben zu (siehe Tabelle 10.7). Das folgende Codefragment gibt »4« aus:
Dim sb As New StringBuilder("1234567") Console.Write(sb(3))
Eigenschaft | Methode | |
Capacity |
Kapazität des StringBuilder-Objekts |
|
Chars |
Das Zeichen an einer Position in der Zeichenfolge (Indexer) |
|
Length |
Die Länge der Zeichenfolge |
|
MaxCapacity |
Die Maximalkapazität des StringBuilder-Objekts |
R |
10.4.4 Methoden
In der Klasse StringBuilder sind viel weniger Methoden als in String (siehe Tabelle 10.8).
Methode | Eigenschaft |
Append |
Hängt an eine bestehende Instanz eine Zeichenfolge an. |
AppendFormat |
Fügt eine Zeichenfolge mit Formatangaben an. |
AppendLine |
Fügt eine Zeile hinzu. |
CopyTo |
Kopiert einen Teil des Objekts in ein Char-Array. |
EnsureCapacity |
Stellt sicher, dass die Kapazität mindestens so groß ist wie angegeben. |
Insert |
Fügt an einer Position eine Zeichenfolge ein. |
Remove |
Löscht ab einer Position eine Zeichensequenz. |
Replace |
Ersetzt in der gesamten Zeichenfolge ein Zeichen durch ein anderes. |
Zuweisung einer Zeichenkette
Statt einer direkten Zuweisung verwenden Sie Append zum Aufbau von Zeichenfolgen. Alle Überladungen sind als Public Function deklariert.
Append(value As Basis) As StringBuilder Append(value As Char()) As StringBuilder Append(value As Char, repeatCount As Integer) As StringBuilder Append(value As String, start As Integer, count As Integer) As StringBuilder Append(value As Char(), start As Integer, count As Integer) As StringBuilder Basis: Boolean, Byte, Char, Decimal, Double, Short, Integer, Long, Object, SByte, Single, String, UInt16, UInt32, UInt64 |
Durch die Rückgabe eines StringBuilder-Objekts können Sie Befehle aneinanderhängen:
Dim sb As New StringBuilder()
sb.Append("Domkloster ").Append(4).Append(" (Köln)") 'Domkloster 4 (Köln)
Brauchen Sie eine Zeichenkette vom Typ String, liefert ToString eine Kopie der im StringBuilder-Objekt gespeicherten Zeichen.
Einfügen einer Zeichenfolge
Bis auf die Überladung mit dem Wiederholungszeichen hat Insert zu jeder der Überladungen von Append ein Pendant, das als zusätzliches erstes Argument die Einfügeposition angibt.
Dim sb As New StringBuilder()
Console.Write(sb.Append("fällt Schnee").Insert(0, "Im Winter "))
Die Ausgabe dieses Codefragments lautet:
Im Winter fällt Schnee
Löschen aus einer Zeichenfolge
Remove löscht ab der im ersten Argument angegebenen Position die im zweiten Argument angegebene Anzahl Zeichen. Zum Beispiel schreiben Sie zum Löschen der Zeichen 4 und 5:
sbObject.Remove(3, 2)
Ersetzen eines Zeichens oder einer Zeichenfolge
Zu den Ersetzungsmöglichkeiten der Klasse String kommen noch zwei Überladungen, die den Bearbeitungsbereich einschränken. Alle Überladungen sind mit Public Function deklariert.
Replace(alt As Char, neu As Char) As StringBuilder Replace(alt As String, neu As String) As StringBuilder Replace(alt As Char, neu As Char, start As Integer, count As Integer) _ As StringBuilder Replace(alt As String, neu As String, start As Integer, count As Integer) _ As StringBuilder |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.