Instrucțiunile tradiționale `switch-case` și lanțurile lungi de `if (x is Tip && ((Tip)x).Proprietate == y)` erau greoaie și predispuse la erori de tip `NullReferenceException`. C# modern a transformat Pattern Matching într-un sistem de nivel funcțional inspirat din F# și Rust.
Prin Switch Expressions (expresii switch), puteți potrivi datele pe baza structurii lor interne: Property Patterns (potrivire pe proprietăți ale obiectelor imbricate), Relational Patterns (comparare pe intervale matematice cu `<`, `>=`, `and`, `or`), și Positional Patterns (pe baza deconstrucției tuplelor).
Compilatorul verifică exhaustivitatea evaluării (exhaustiveness checking): dacă adăugați o stare nouă într-un enum sau o clasă polimorfică, compilatorul vă avertizează imediat dacă ați omis vreun caz netratat.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
Switch Expression (=>) |
Sintaxa funcțională concisă ce returnează direct o valoare pe baza potrivirii. |
Property Pattern { Status: "Activ" } |
Filtrare directă pe atributele interne ale obiectului inspectat. |
Relational Pattern (>= 18 and < 65) |
Verificarea intervalelor numerice fără repetarea variabilei. |
Discard Pattern (_) |
Cazul implicit (default) de fallback care prinde orice valoare neacoperită anterior. |
Exemple practice și cod
Exemplul 1: Calculul reducerii de preț folosind switch expressions și pattern matching pe proprietăți
Logică complexă de afaceri rezolvată în câteva linii declarative.
public record Comanda(decimal Total, bool ClientFidel, int VechimeAni);
public decimal CalculeazaReducere(Comanda comanda) => comanda switch
{
// Clienți foarte vechi cu comenzi mari: 20% reducere
{ Total: > 1000, VechimeAni: >= 5 } => 0.20m,
// Clienți fideli indiferent de vechime: 10% reducere
{ ClientFidel: true } => 0.10m,
// Comenzi peste 500 lei fără fidelitate: 5% reducere
{ Total: >= 500 } => 0.05m,
// Oricine altcineva: fără reducere
_ => 0.00m
};
Rezultat & Impact
Cod curat, fără variabile temporare și complet garantat împotriva erorilor de null.
Greșeli frecvente și bune practici
- Omiterea cazului de discard `_`, ceea ce declanșează o eroare `SwitchExpressionException` la runtime dacă se primește o valoare neprevăzută.
- Plasarea unui pattern mai general deasupra unui pattern specific, ceea ce face ca cel de-al doilea caz să nu fie atins niciodată (unreachable code).