StringBuilder
Obiekt typu String jest niezmienny, tzn. po utworzeniu Stringa nie można go zmienić. Za każdym razem, gdy używasz dowolnej z metod klasy System.String, tworzysz nowy obiekt ciągu w pamięci. Na przykład ciąg „Witaj świecie” zajmuje pamięć na stercie, teraz, zmieniając początkowy ciąg „Witaj świecie” na „Witaj”, tworzony jest nowy obiekt ciągu na stercie pamięci zamiast modyfikować początkowy ciąg w tej samej lokalizacji pamięci.
W sytuacjach, w których konieczne jest dokonanie wielokrotnych modyfikacji ciągu znaków, potrzebujemy klasy StringBuilder.
Aby uniknąć zastępowania ciągów, dołączania, usuwania lub wstawiania nowych ciągów w początkowym ciągu C# wprowadź koncepcję StringBuilder.
StringBuilder to obiekt dynamiczny. Nie tworzy nowego obiektu w pamięci, ale dynamicznie rozszerza potrzebną pamięć, aby pomieścić zmodyfikowany lub nowy ciąg.
Deklaracja i inicjalizacja StringBuilder
StringBuilder można zadeklarować i zainicjować w taki sam sposób jak klasę.
StringBuilder str = new StringBuilder();
lub
StringBuilder str = new StringBuilder("Witaj świecie");
„str” jest obiektem klasy StringBuilder. Możemy również przekazać wartość ciągu (tutaj „Witaj świecie”) jako argument do konstruktora StringBuilder.
Definiowanie pojemności StringBuilder
Chociaż StringBuilder jest obiektem dynamicznym, który umożliwia rozszerzenie liczby znaków w ciągu, który hermetyzuje, można określić wartość maksymalnej liczby znaków, które może przechowywać. Ta wartość jest nazywana pojemnością obiektu StringBuilder.
StringBuilder str = new StringBuilder(40);
lub
StringBuilder str = new StringBuilder("Witaj świecie", 40);
Tutaj w pierwszej instrukcji przekazujemy jako argument do konstruktora wartość całkowitą. Jest to maksymalna pojemność, którą może pomieścić ciąg. W drugiej instrukcji przekazujemy jako argumenty do konstruktora zawartość ciągu oraz liczbę całkowitą czyli maksymalną pojemność, jaką może przechowywać łańcuch.
Ważne metody klasy StringBuilder:
- Append(string value)
- AppendFormat()
- Insert(int index, string value)
- Remove(int start, int length)
- Replace(old_val, new|_val)
Metoda StringBuilder.Append(string value)
Metoda Append() może służyć do dodawania lub dołączania wartości ciągu obiektu na końcu ciągu reprezentowanego przez bieżący obiekt StringBuilder.
Metoda AppendLine() również podlega tej metodzie. Ta metoda dołącza ciąg z nową linią na końcu.
Przykład:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder str = new StringBuilder("Witaj ", 20);
str.Append("świecie");
// po wydrukiwaniu Test
// dodanie nowej linii
str.AppendLine(" Test");
str.Append(" kolejny tekst");
Console.WriteLine(str);
}
}
Wynik:
Metoda StringBuilder.AppendFormat()
Ta metoda służy do formatowania ciągu wejściowego do określonego formatu, a następnie dołączania go. Ta metoda dołącza również tekst na końcu obiektu StringBuilder.
Przykład:
public static void Main()
{
StringBuilder str = new StringBuilder("Sumowanna kwota to: ");
str.AppendFormat("{0:C} ", 1000);
Console.WriteLine(str);
}
Wynik:
Metoda StringBuilder.Insert(int index, string value)
Ta metoda wstawia ciąg pod określony indeks w obiekcie StringBuilder.
Przykład:
public static void Main()
{
StringBuilder s = new StringBuilder("Witaj ", 50);
// wstaw po szóstym indeksie
s.Insert(6, "świecie");
Console.WriteLine(s);
}
Wynik:
Metoda StringBuilder.Remove(int start, int length)
Ta metoda usuwa określoną liczbę znaków z bieżącego obiektu StringBuilder. Proces usuwania zaczyna się od określonego indeksu i rozciąga się do innego określonego indeksu.
Przykład:
public static void Main()
{
StringBuilder str = new StringBuilder("Witaj świecie", 20);
// remove zaczyna się od indeksu 6 i usuwa 3 znaki po indeksie 6
str.Remove(6, 3);
Console.WriteLine(str);
}
Wynik:
Metoda StringBuilder.Replace(stara_wartość, nowa_wartość)
Ta metoda służy do zastępowania znaków w obiekcie StringBuilder innym określonym znakiem.
Przykład:
public static void Main()
{
StringBuilder str = new StringBuilder("Witaj świecie", 20);
str.Replace("Witaj świecie", "Witaj Marcin");
Console.WriteLine(str);
}