Použití třídy StringBuilder v .NET

Objekt String je neměnný. Pokaždé, když použijete jednu z metod ve System.String třídě, vytvoříte nový objekt řetězce v paměti, který vyžaduje nové přidělení místa pro tento nový objekt. V situacích, kdy potřebujete provádět opakované úpravy řetězce, může být režie spojená s vytvořením nového String objektu nákladná. Třídu System.Text.StringBuilder lze použít, pokud chcete upravit řetězec bez vytvoření nového objektu. Například použití StringBuilder třídy může zvýšit výkon při zřetězení mnoha řetězců ve smyčce.

Import oboru názvů System.Text

Třída StringBuilder se nachází v System.Text oboru názvů. Pokud se chcete vyhnout zadání plně kvalifikovaného názvu typu v kódu, můžete obor názvů importovat System.Text :

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

Vytvoření instance objektu StringBuilder

Novou instanci StringBuilder třídy můžete vytvořit inicializací proměnné pomocí jedné z přetížených metod konstruktoru, jak je znázorněno v následujícím příkladu.

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

Nastavení kapacity a délky

StringBuilder I když je dynamický objekt, který umožňuje rozbalit počet znaků v řetězci, který zapouzdřuje, můžete zadat hodnotu pro maximální počet znaků, které může obsahovat. Tato hodnota se nazývá kapacita objektu a neměla by být zaměňována s délkou řetězce, který aktuální StringBuilder obsahuje. Můžete například vytvořit novou instanci StringBuilder třídy s řetězcem "Hello", který má délku 5, a můžete určit, že objekt má maximální kapacitu 25. Při úpravě StringBuilderse velikost sama o sobě nepřidělí, dokud nedosáhnete kapacity. V takovém případě se nové místo přidělí automaticky a kapacita se zdvojnásobí. Kapacitu StringBuilder třídy můžete zadat pomocí jednoho z přetížených konstruktorů. Následující příklad určuje, že myStringBuilder objekt lze rozšířit na maximálně 25 mezer.

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

Kromě toho můžete použít vlastnost pro čtení a zápis Capacity k nastavení maximální délky objektu. Následující příklad používá Capacity vlastnost definovat maximální délku objektu.

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

Metodu EnsureCapacity lze použít ke kontrole kapacity aktuální StringBuilder. Pokud je kapacita větší než předaná hodnota, neprovedou se žádné změny; Pokud je však kapacita menší než předaná hodnota, aktuální kapacita se změní tak, aby odpovídala předané hodnotě.

Vlastnost Length lze také zobrazit nebo nastavit. Pokud vlastnost Length nastavíte na hodnotu, která je větší než vlastnost Capacity, vlastnost Capacity se automaticky změní na stejnou hodnotu jako Length vlastnost. Nastavení vlastnosti Length na hodnotu, která je menší než délka řetězce v aktuálním StringBuilderu zkracuje řetězec.

Úprava řetězce StringBuilder

Následující tabulka uvádí metody, které můžete použít k úpravě obsahu StringBuilder.

Název metody Používání
StringBuilder.Append Připojí informace na konec aktuálního StringBuilderu.
StringBuilder.AppendFormat Nahradí specifikátor formátu předaný v řetězci formátovaným textem.
StringBuilder.Insert Vloží řetězec nebo objekt do zadaného indexu aktuální StringBuilder.
StringBuilder.Remove Odebere zadaný počet znaků z aktuálního StringBuilderu.
StringBuilder.Replace Nahradí všechny výskyty zadaného znaku nebo řetězce v aktuálním StringBuilderu jiným zadaným znakem nebo řetězcem.

Připojit

Metoda Append lze použít k přidání textu nebo řetězcové reprezentace objektu na konec řetězce reprezentované aktuálním StringBuilder. Následující příklad inicializuje StringBuilder na "Hello World" a pak připojí nějaký text na konec objektu. Prostor se automaticky přidělí podle potřeby.

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

Metoda StringBuilder.AppendFormat přidá text na konec objektu StringBuilder . Podporuje funkci složeného formátování (další informace viz Složené formátování) voláním IFormattable implementace objektu nebo objektů, které mají být formátovány. Proto přijímá standardní formátovací řetězce pro číselné hodnoty, datum a čas a výčty, vlastní formátovací řetězce pro číselné a hodnoty data a času a formátovací řetězce definované pro vlastní typy. (Informace o formátování najdete v tématu Typy formátování.) Tuto metodu můžete použít k přizpůsobení formátu proměnných a připojení těchto hodnot k objektu StringBuilder. Následující příklad používá metodu AppendFormat k umístění celočíselné hodnoty formátované jako hodnota měny na konec objektu StringBuilder .

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  

Vložit

Metoda Insert přidá řetězec nebo objekt do zadané pozice v aktuálním StringBuilder objektu. Následující příklad používá tuto metodu k vložení slova do šesté pozice objektu StringBuilder .

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!

Odebrat

Metodu Remove můžete použít k odebrání zadaného počtu znaků z aktuálního StringBuilder objektu, počínaje zadaným indexem založeným na nule. Následující příklad používá Remove metoda ke zkrácení objektu StringBuilder .

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

Nahradit

Metodu Replace lze použít k nahrazení znaků uvnitř StringBuilder objektu jiným zadaným znakem. Následující příklad používá metodu Replace k vyhledání objektu StringBuilder pro všechny instance vykřičníku znak (!) a nahradit je znakem otazníku (?).

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?

Převod objektu StringBuilder na řetězec

Před předáním String řetězce reprezentované StringBuilder objektem do metody, která má String parametr nebo jej zobrazit v uživatelském rozhraní, musíte převést StringBuilder objekt na objekt. Tento převod provedete voláním StringBuilder.ToString metody. Následující příklad volá řadu StringBuilder metod a potom volá metodu StringBuilder.ToString() pro zobrazení řetězce.

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

Viz také