Ce face StringBuilder
Deoarece obiectele string sunt imutabile, concatenarea repetată cu += în interiorul unei bucle (de exemplu, construirea unui fișier CSV cu 10.000 de rânduri) obligă runtime-ul .NET să aloce un nou bloc de memorie și să copieze tot textul acumulat anterior la fiecare iterație, ducând la o complexitate pătratică O(n²) și la o presiune uriașă asupra Garbage Collector-ului.
Clasa System.Text.StringBuilder rezolvă această problemă menținând intern un buffer mutabil de caractere care se extinde automat (similar cu List<char>) în timp amortizat O(1) la fiecare apel Append sau AppendLine. La finalul prelucrării, un singur apel sb.ToString() materializează șirul final.
Parametri, metode și opțiuni
| Parametru / Metodă | Descriere |
|---|---|
new StringBuilder(int capacity) |
Creează un StringBuilder prealocând o capacitate inițială de caractere pentru a evita redimensionările bufferului. |
sb.Append(valoare) |
Adaugă reprezentarea textuală a valorii la sfârșitul bufferului și returnează aceeași instanță (permite înlănțuirea apelurilor). |
sb.AppendLine(string? text) |
Adaugă textul specificat urmat de terminatorul de linie standard (Environment.NewLine). |
sb.AppendJoin(sep, valori) |
Concatenează o colecție direct în bufferul StringBuilder folosind separatorul dat, fără a aloca un șir intermediar. |
sb.Replace(vechi, nou) / Clear() |
Înlocuiește toate aparițiile direct în bufferul intern sau golește complet conținutul (Length = 0) pentru reutilizare. |
sb.ToString() |
Convertește conținutul acumulat în buffer într-un obiect string imutabil. |
Exemple
Exemplul 1: Generarea unui raport CSV din mai multe înregistrări cu StringBuilder
Prealocăm capacitatea estimată și folosim AppendLine și interpolarea direct în StringBuilder (care în .NET 6+ folosește un AppendInterpolatedStringHandler fără alocări intermediare).
using System.Text;
var produse = new (int Id, string Nume, decimal Pret)[]
{
(101, "Tastatură mecanică", 420.00m),
(102, "Mouse wireless", 215.50m),
(103, "Monitor 27 inch 4K", 1650.00m)
};
var sb = new StringBuilder(capacity: 256);
sb.AppendLine("Id,Denumire,PretRON");
foreach (var p in produse)
{
sb.AppendLine($"{p.Id},\"{p.Nume}\",{p.Pret:F2}");
}
string csv = sb.ToString();
Console.Write(csv);
Console.WriteLine($"Total caractere generate: {sb.Length} (capacitate buffer: {sb.Capacity})");
Ieșire în consolă
Id,Denumire,PretRON
101,"Tastatură mecanică",420.00
102,"Mouse wireless",215.50
103,"Monitor 27 inch 4K",1650.00
Total caractere generate: 109 (capacitate buffer: 256)
Exemplul 2: Înlănțuirea fluentă a metodelor Append și AppendJoin
Deoarece fiecare apel Append returnează referința către același StringBuilder, putem construi interogări sau fragmente HTML într-un stil fluent.
using System.Text;
string[] coloane = { "id", "nume", "email", "data_inregistrarii" };
var sql = new StringBuilder()
.Append("SELECT ")
.AppendJoin(", ", coloane)
.AppendLine()
.Append("FROM utilizatori ")
.Append("WHERE activ = 1;")
.ToString();
Console.WriteLine(sql);
Ieșire în consolă
SELECT id, nume, email, data_inregistrarii
FROM utilizatori WHERE activ = 1;
Greșeli frecvente
- Folosirea lui
StringBuilderpentru o simplă concatenare a 2–4 șiruri în afara unei bucle — pentru expresii dintr-o singură instrucțiune (precum$"Salut, {prenume} {nume}!"), compilatorul C# generează cod mai rapid și mai compact decât instanțierea unuiStringBuilder. - Concatenarea cu
+în interiorul apeluluisb.Append("ID: " + id + ", Nume: " + nume), ceea ce alocă unstringintermediar înainte de a ajunge în buffer; foloseștesb.Append($"ID: {id}, Nume: {nume}")(optimizat în .NET 6+) sau apeluriAppendînlănțuite.
Funcții și concepte înrudite
Interpolarea șirurilor ($"..."): Construiește șiruri de caractere lizibile prin încorporarea directă a expresiilor C# și a specificatorilor de formatare între acolade.Replace, Trim și Substring: Curăță spațiile de la capete, înlocuiește fragmente de text și extrage sub-șiruri prin Substring sau operatorul de interval (..).String.Split / String.Join: Desparte un șir de caractere într-un tablou de sub-șiruri după delimitatori și recompune o colecție într-un singur șir.