Pattern Matching Avansat & Switch Expressions în C# în C# (.NET)

Evaluarea elegantă și expresivă a tipurilor de date, proprietăților imbricate și intervalelor numerice fără instrucțiuni stufoase if-else.

Sintaxă C#
valoare switch { Tip tip when conditie => ..., _ => ... }

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).

Ghiduri și noțiuni înrudite