loading experience

C#

Pattern matching in C# moderno: record, switch e list pattern

Dalle espressioni switch ai list pattern: come esprimere regole di business in modo leggibile e verificato dal compilatore.

Pattern matching in C# moderno: record, switch e list pattern

Il pattern matching ha trasformato il modo di scrivere logica condizionale in C#. Combinato con i record, permette di esprimere regole complesse in poche righe leggibili.

I casi si valutano dall'alto: i più specifici vanno per primi.
I casi si valutano dall'alto: i più specifici vanno per primi.

Espressioni switch con proprietà

public record Ordine(decimal Totale, string Paese, bool ClientePremium);

decimal Spedizione(Ordine o) => o switch
{
    { ClientePremium: true }          => 0m,
    { Paese: "IT", Totale: >= 50m }   => 0m,
    { Paese: "IT" }                   => 5.90m,
    { Totale: >= 150m }               => 9.90m,
    _                                 => 19.90m
};

Le regole si leggono dall'alto verso il basso e il compilatore avvisa se un caso non è mai raggiungibile.

Pattern relazionali e logici

string Fascia(int eta) => eta switch
{
    < 0              => throw new ArgumentOutOfRangeException(nameof(eta)),
    < 18             => "minorenne",
    >= 18 and < 65   => "adulto",
    _                => "senior"
};

List pattern

I list pattern confrontano la forma di un array o di una lista: primo elemento, ultimo, lunghezza, porzioni.

string Descrivi(string[] argomenti) => argomenti switch
{
    []                    => "nessun comando",
    ["help"]              => "mostra la guida",
    ["copy", var da, var a] => $"copia {da} in {a}",
    ["log", .. var resto] => $"log con {resto.Length} opzioni",
    _                     => "comando sconosciuto"
};

Consigli

  • Metti i casi più specifici prima di quelli generici.
  • Evita espressioni switch troppo lunghe: oltre una decina di casi valuta una tabella di regole.
  • Con le gerarchie chiuse di record, il compilatore aiuta a non dimenticare casi.
Commenti (0)

Nessun commento ancora.

Lascia un commento