Interpolarea șirurilor ($”…”) în C# (.NET)

Bazele limbajului și I/O C# 6.0+ (raw """ în C# 11+)

Construiește șiruri de caractere lizibile prin încorporarea directă a expresiilor C# și a specificatorilor de formatare între acolade.

Sintaxă C#
$"Text {expresie,aliniere:format}" | $"""Text raw pe mai multe linii {expresie}"""

Ce face Interpolarea șirurilor ($"...")

Interpolarea șirurilor (prefixul $ înaintea ghilimelelor) înlocuiește apelurile greoaie la string.Format("Salut {0}, sold: {1:F2}", nume, sold) cu o sintaxă clară și verificată la compilare: $"Salut {nume}, sold: {sold:F2}". În C# 10+, dacă toate expresiile interpolate sunt constante de tip string, întregul șir interpolat poate fi declarat const, iar compilatorul folosește intern DefaultInterpolatedStringHandler pentru a minimiza alocările de memorie pe heap.

Fiecare expresie dintre acolade suportă opțional o lățime de aliniere (pozitivă pentru aliniere la dreapta, negativă pentru aliniere la stânga) și un specificator de formatare după două puncte (:F2 pentru două zecimale, :N0 pentru separator de mii, :yyyy-MM-dd pentru date calendaristice). Începând cu C# 11, poți combina interpolarea cu raw string literals ($"""...""") pentru a scrie șabloane JSON, SQL sau HTML pe mai multe linii fără a dubla ghilimelele.

Parametri, metode și opțiuni

Parametru / Metodă Descriere
$"... {expr} ..." Evaluează expresia C# expr și inserează rezultatul în șirul final.
{expr:F2} / {expr:N2} Formatează un număr cu exact 2 zecimale (F2) sau cu 2 zecimale și separator de mii (N2).
{expr:P1} / {expr:X4} Formatează valoarea ca procentaj cu o zecimală (0.156 devine 15.6%) sau în hexazecimal pe 4 cifre.
{expr,10} / {expr,-10} Aliniază textul pe o coloană de minimum 10 caractere: la dreapta (pozitiv) sau la stânga (negativ).
{data:yyyy-MM-dd HH:mm} Formatează un obiect DateTime sau DateOnly după masca specificată.
$@"..." / $"""...""" Combină interpolarea cu șiruri verbatim (pentru căi de fișiere) sau raw multi-line (C# 11+).

Exemple

Exemplul 1: Formatarea numerelor, procentelor și tabelarea în consolă

Folosim alinierea pe coloane (,-15 și ,10) împreună cu specificatorul numeric :F2 pentru a afișa o factură aliniată impecabil.

using System.Globalization;
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

var produse = new (string Denumire, int Buc, decimal PretUnitar)[]
{
    ("SSD NVMe 1TB", 2, 349.90m),
    ("Memorie RAM 32GB", 1, 520.00m),
    ("Cablu HDMI 2.1", 3, 45.50m)
};

Console.WriteLine($"{"Produs",-18} {"Cant.",5} {"Total (RON)",14}");
Console.WriteLine(new string('-', 39));

foreach (var p in produse)
{
    Console.WriteLine($"{p.Denumire,-18} {p.Buc,5} {p.Buc * p.PretUnitar,14:F2}");
}

Ieșire în consolă

Produs             Cant.    Total (RON)
---------------------------------------
SSD NVMe 1TB           2         699.80
Memorie RAM 32GB       1         520.00
Cablu HDMI 2.1         3         136.50

Exemplul 2: Raw string literals interpolate ($$”””…”””) pentru JSON în C# 11+

Când șirul conține deja acolade (cum este cazul unui obiect JSON), prefixarea cu două semne dolar ($$""") indică faptul că expresiile C# se scriu în acolade duble {{expresie}}, iar acoladele simple rămân literale în JSON.

int idUtilizator = 1042;
string rol = "admin";
bool activ = true;

string payloadJson = $$"""
{
  "userId": {{idUtilizator}},
  "role": "{{rol}}",
  "isActive": {{activ.ToString().ToLowerInvariant()}}
}
""";

Console.WriteLine(payloadJson);

Ieșire în consolă

{
  "userId": 1042,
  "role": "admin",
  "isActive": true
}

Greșeli frecvente

  • Folosirea operatorului ternar ? : în interiorul unei acolade de interpolare fără paranteze: în $"{scor >= 50 ? "Admis" : "Respins"}", compilatorul confundă caracterul : cu un specificator de formatare. Scrie întotdeauna cu paranteze: $"{(scor >= 50 ? "Admis" : "Respins")}".
  • Uitarea dublării acoladelor ({{ și }}) atunci când vrei să afișezi o acoladă literală într-un șir interpolat obișnuit $"...".
  • Construirea interogărilor SQL prin interpolare directă de șiruri ($"SELECT * FROM Users WHERE Name = '{nume}'"), ceea ce deschide vulnerabilități critice de SQL Injection; folosește întotdeauna parametri SQL sau metodele parametrizate din Dapper / EF Core.

Funcții și concepte înrudite

  • Console.WriteLine / ReadLine: Afișează text în fluxul standard de ieșire și citește linii de text introduse de utilizator în consolă.
  • StringBuilder: Construiește și modifică eficient șiruri de caractere într-un buffer mutabil, fără a aloca obiecte intermediare în bucle.
  • 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 (..).