StringBuilder în C# (.NET)

Construiește și modifică eficient șiruri de caractere într-un buffer mutabil, fără a aloca obiecte intermediare în bucle.

Sintaxă C#
var sb = new StringBuilder(); sb.Append("..."); sb.AppendLine("..."); string rez = sb.ToString();

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 StringBuilder pentru 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 unui StringBuilder.
  • Concatenarea cu + în interiorul apelului sb.Append("ID: " + id + ", Nume: " + nume), ceea ce alocă un string intermediar înainte de a ajunge în buffer; folosește sb.Append($"ID: {id}, Nume: {nume}") (optimizat în .NET 6+) sau apeluri Append î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.