Le istruzioni switch hanno una storia illustre nei linguaggi di programmazione. Furono introdotte in C, dove erano apprezzate per la loro velocità. Quella velocità aveva però un costo: una funzionalità molto limitata. In C# il ruolo dell'istruzione switch è stato ampliato oltre gli interi. Le istruzioni switch possono comprendere qualsiasi tipo arbitrario, di valore o di riferimento.
Se arrivi da un linguaggio funzionale, lavorare con le istruzioni switch (e con le espressioni switch di cui parliamo altrove) è la cosa più vicina che troverai in C# all'uso delle unioni discriminate e del pattern matching. Tuttavia, sono ben lontane dal potere delle unioni discriminate di garantire la sicurezza dei tipi.
Le istruzioni switch semplici assomigliano ai loro antenati in C e combinano switch, case, break e default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
Il modello precedente può essere usato con qualsiasi tipo semplice (primitivi e stringhe).
Quando si aggiungono anche i tipi di riferimento, entra in gioco una sintassi aggiuntiva: prima per eseguire il cast verso il basso del tipo, poi per aggiungere delle guardie (when), anche se le guardie si possono usare anche con i case di valori semplici. Lo illustriamo qui sotto:
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default è facoltativa, ma di solito è opportuna.break è obbligatoria per qualsiasi clausola case non vuota.case deve derivare dal tipo dell'argomento di switch. Un argomento di switch di tipo Object consente ovviamente la gamma più ampia.case.case con argomenti diversi possono fare riferimento allo stesso blocco di codice.La documentazione sull'istruzione switch offre un'introduzione alle istruzioni switch.