Verwenden der StringBuilder-Klasse in .NET

Das String-Objekt ist unveränderlich. Jedes Mal, wenn Sie eine der Methoden in der System.String-Klasse verwenden, erstellen Sie ein neues Zeichenfolgenobjekt im Speicher, das eine neue Speicherbelegung für dieses neue Objekt erfordert. In Fällen, in denen Sie wiederholte Änderungen an einer Zeichenfolge vornehmen müssen, kann der Mehraufwand, der mit dem Erstellen eines neuen String-Objekts verbunden ist, erheblich sein. Die System.Text.StringBuilder-Klasse kann verwendet werden, wenn Sie eine Zeichenfolge ändern möchten, ohne ein neues Objekt zu erstellen. Beispielsweise lässt sich durch Verwenden der StringBuilder-Klasse die Leistung steigern, wenn zahlreiche Zeichenfolgen in einer Schleife verkettet werden.

Importieren des System.Text-Namespace

Die StringBuilder-Klasse befindet sich im System.Text-Namespace. Wenn Sie in Ihrem Code nicht den vollqualifizierten Typnamen bereitstellen möchten, können Sie den System.Text-Namespace importieren:

using namespace System;
using namespace System::Text;
using System;
using System.Text;
Imports System.Text

Instanziieren eines StringBuilder-Objekts

Sie können eine neue Instanz der StringBuilder-Klasse erstellen, indem Sie Ihre Variable mit einer der Methoden für überladene Konstruktoren initialisieren, wie im folgenden Beispiel verdeutlicht.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")

Festlegen von Kapazität und Länge

Obwohl ein StringBuilder-Objekt ein dynamisches Objekt ist, das die Erhöhung der Zeichenanzahl der darin gekapselten Zeichenfolge ermöglicht, können Sie einen Wert für die maximale Anzahl von Zeichen festlegen, die das Objekt enthalten darf. Dieser Wert wird als Kapazität des Objekts bezeichnet und darf nicht mit der Länge der Zeichenfolge verwechselt werden, die im aktuellen StringBuilder-Objekt enthalten ist. Sie könnten z.B. eine neue Instanz der StringBuilder-Klasse mit der Zeichenfolge „Hello“ erstellen, die eine Länge von 5 Zeichen hat, und angeben, dass das Objekt eine maximale Kapazität von 25 Zeichen hat. Bei einer Änderung des StringBuilder-Objekts ordnet es sich selbst erst dann eine neue Größe zu, wenn die Kapazität erreicht ist. Tritt dieser Fall ein, wird der neue Speicherplatz automatisch zugeordnet, und die Kapazität wird verdoppelt. Sie können die Kapazität der StringBuilder-Klasse angeben, indem Sie einen der überladenen Konstruktoren verwenden. Im folgenden Beispiel wird festgelegt, dass das myStringBuilder-Objekt auf maximal 25 Zeichen erweitert werden kann.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25);
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)

Darüber hinaus können Sie die Capacity-Eigenschaft mit Lese-/Schreibzugriff verwenden, um die maximale Länge Ihres Objekts festzulegen. Im folgenden Beispiel wird die Capacity-Eigenschaft verwendet, um die maximale Objektlänge zu definieren.

myStringBuilder->Capacity = 25;
myStringBuilder.Capacity = 25;
myStringBuilder.Capacity = 25

Mithilfe der EnsureCapacity-Methode kann die Kapazität des aktuellen StringBuilder-Objekts überprüft werden. Ist die Kapazität größer als der übergebene Wert, wird keine Änderung vorgenommen. Ist die Kapazität dagegen kleiner als der übergebene Wert, wird die aktuelle Kapazität entsprechend dem übergebenen Wert geändert.

Die Length-Eigenschaft kann auch angezeigt oder festgelegt werden. Wenn Sie für die Length-Eigenschaft einen Wert festlegen, der größer ist als der Wert der Capacity-Eigenschaft, wird die Capacity-Eigenschaft automatisch auf den Wert der Length-Eigenschaft festgelegt. Ist die Length-Eigenschaft auf einen Wert festgelegt, der kleiner als die Länge der Zeichenfolge im aktuellen StringBuilder-Objekt ist, wird die Zeichenfolge gekürzt.

Ändern der StringBuilder-Zeichenfolge

In der folgenden Tabelle sind die Methoden aufgeführt, mit denen Sie den Inhalt eines StringBuilder-Objekts ändern können.

Methodenname Verwendung
StringBuilder.Append Fügt Informationen an das Ende des aktuellen StringBuilder-Objekts an.
StringBuilder.AppendFormat Ersetzt einen in einer Zeichenfolge übergebenen Formatbezeichner durch formatierten Text.
StringBuilder.Insert Fügt eine Zeichenfolge oder ein Objekt in den angegebenen Index des aktuellen StringBuilder-Objekts ein.
StringBuilder.Remove Entfernt eine angegebene Anzahl von Zeichen aus dem aktuellen StringBuilder-Objekt.
StringBuilder.Replace Hiermit werden alle Vorkommen eines angegebenen Zeichens bzw. einer angegebenen Zeichenfolge im aktuellen StringBuilder-Objekt durch ein anderes Zeichen bzw. eine andere Zeichenfolge ersetzt.

Append

Mithilfe der Append-Methode kann Text oder eine Zeichenfolgendarstellung eines Objekts am Ende einer Zeichenfolge hinzugefügt werden, die durch den aktuellen StringBuilder dargestellt wird. Im folgenden Beispiel wird ein StringBuilder-Objekt auf „Hello World“ initialisiert und anschließend Text am Ende des Objekts angefügt. Speicherplatz wird automatisch nach Bedarf zugeordnet.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Append(" What a beautiful day.");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Append(" What a beautiful day.")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello World! What a beautiful day.

AppendFormat

Die StringBuilder.AppendFormat-Methode fügt Text am Ende des StringBuilder-Objekts hinzu. Die Methode unterstützt das Feature für die kombinierte Formatierung (weitere Informationen finden Sie unter Kombinierte Formatierung) durch Aufrufen der IFormattable-Implementierung der Objekte, die formatiert werden sollen. Daher akzeptiert sie die Standardformatzeichenfolgen für numerische Werte, Datums- und Uhrzeitwerte sowie Enumerationswerte, die benutzerdefinierten Formatzeichenfolgen für numerische Werte sowie Datums- und Uhrzeitwerte und die Formatzeichenfolgen, die für benutzerdefinierte Typen definiert sind. (Weitere Informationen zur Formatierung finden Sie unter Formatieren von Typen.) Sie können diese Methode verwenden, um das Format von Variablen anzupassen und diese Werte an ein StringBuilder-Objekt anzufügen. Im folgenden Beispiel wird die AppendFormat-Methode verwendet, um einen als Währungswert formatierten ganzzahligen Wert am Ende eines StringBuilder-Objekts einzufügen.

int MyInt = 25;
StringBuilder^ myStringBuilder = gcnew StringBuilder("Your total is ");
myStringBuilder->AppendFormat("{0:C} ", MyInt);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Your total is $25.00
int MyInt = 25;
StringBuilder myStringBuilder = new StringBuilder("Your total is ");
myStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Your total is $25.00
Dim MyInt As Integer = 25
Dim myStringBuilder As New StringBuilder("Your total is ")
myStringBuilder.AppendFormat("{0:C} ", MyInt)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'     Your total is $25.00  

Insert

Mit der Insert-Methode wird an einer angegebenen Position im aktuellen StringBuilder-Objekt eine Zeichenfolge oder ein Objekt hinzugefügt. Im folgenden Beispiel wird mit dieser Methode ein Wort an der sechsten Position eines StringBuilder-Objekts eingefügt.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Insert(6,"Beautiful ");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'      Hello Beautiful World!

Remove

Über die Remove-Methode können Sie, beginnend bei einem angegebenen nullbasierten Index, eine bestimmte Anzahl von Zeichen aus dem aktuellen StringBuilder-Objekt entfernen. Im folgenden Beispiel wird die Remove-Methode verwendet, um ein StringBuilder-Objekt zu kürzen.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Remove(5,7);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Remove(5,7);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Remove(5, 7)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello

Replace

Mithilfe der Replace-Methode können Zeichen im StringBuilder-Objekt durch ein anderes angegebenes Zeichen ersetzt werden. Im folgenden Beispiel wird die Replace-Methode verwendet, um in einem StringBuilder-Objekt nach allen Vorkommen des Ausrufezeichens (!) zu suchen und diese durch das Fragezeichen (?) zu ersetzen.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Replace('!', '?');
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Replace('!', '?');
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello World?

Konvertieren eines StringBuilder-Objekts in eine Zeichenfolge

Sie müssen das StringBuilder-Objekt in ein String-Objekt konvertieren, bevor Sie die vom StringBuilder-Objekt dargestellte Zeichenfolge an eine Methode mit einem String-Parameter übergeben können oder diese auf der Benutzeroberfläche anzeigen. Diese Konvertierung führen Sie aus, indem Sie die StringBuilder.ToString-Methode aufrufen. Im folgenden Beispiel werden einige StringBuilder-Methoden und anschließend die StringBuilder.ToString()-Methode aufgerufen, um die Zeichenfolge anzuzeigen.

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      bool flag = true;
      string[] spellings = { "recieve", "receeve", "receive" };
      sb.AppendFormat("Which of the following spellings is {0}:", flag);
      sb.AppendLine();
      for (int ctr = 0; ctr <= spellings.GetUpperBound(0); ctr++) {
         sb.AppendFormat("   {0}. {1}", ctr, spellings[ctr]);
         sb.AppendLine();
      }
      sb.AppendLine();
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//       Which of the following spellings is True:
//          0. recieve
//          1. receeve
//          2. receive
Imports System.Text

Module Example
    Public Sub Main()
        Dim sb As New StringBuilder()
        Dim flag As Boolean = True
        Dim spellings() As String = {"recieve", "receeve", "receive"}
        sb.AppendFormat("Which of the following spellings is {0}:", flag)
        sb.AppendLine()
        For ctr As Integer = 0 To spellings.GetUpperBound(0)
            sb.AppendFormat("   {0}. {1}", ctr, spellings(ctr))
            sb.AppendLine()
        Next
        sb.AppendLine()
        Console.WriteLine(sb.ToString())
    End Sub
End Module
' The example displays the following output:
'       Which of the following spellings is True:
'          0. recieve
'          1. receeve
'          2. receive

Siehe auch