Les instructions switch ont une histoire vénérable dans les langages de programmation. Elles ont été introduites en C, où elles étaient appréciées pour leur rapidité. Cette rapidité se payait toutefois par des fonctionnalités très restreintes. En C#, le rôle de l'instruction switch a été étendu au-delà des entiers : elle peut désormais couvrir n'importe quel type arbitraire, valeur ou référence.
Si tu viens d'un langage fonctionnel, travailler avec les instructions switch (et les expressions switch dont on parle ailleurs) est ce qui se rapproche le plus, en C#, de l'utilisation des unions discriminées et du pattern matching. Elles sont cependant loin d'avoir la capacité des unions discriminées à garantir la sûreté du typage.
Les instructions switch simples ressemblent à leurs ancêtres en C et combinent switch, case, break et default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
Le schéma ci-dessus peut s'utiliser avec n'importe quel type simple (types primitifs et strings).
Quand on y ajoute des types référence, une syntaxe supplémentaire entre en jeu : d'abord pour convertir le type vers le bas, puis pour ajouter des gardes (when), bien que les gardes puissent aussi s'employer avec des cas de valeurs simples. L'exemple ci-dessous l'illustre :
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 est facultative, mais généralement souhaitable.break est obligatoire pour toute clause case non vide.case doit dériver du type de l'argument du switch. Un argument de switch de type Object autorise évidemment la plus grande variété.case.case avec des arguments différents peuvent renvoyer au même bloc de code.La documentation sur les instructions switch fournit une introduction aux instructions switch.