Maîtrisez le switch classique, les switch expressions et le pattern matching moderne afin d’écrire des décisions C# plus concises, plus sûres et lisibles.

Switch et pattern matching en C# : guide pratique
Quand une décision dépend de plusieurs valeurs possibles d’une même donnée, un switch exprime souvent l’intention plus clairement qu’une longue suite de if/else.
Les variables de l’exemple
Pour exécuter les extraits, déclarez d’abord :
int choix = 2;
decimal montant = 320m;
bool estMembre = true;
Le switch classique
switch (choix)
{
case 1:
Console.WriteLine("Problème de démarrage");
break;
case 2:
Console.WriteLine("Problème réseau");
break;
default:
Console.WriteLine("Choix inconnu");
break;
}
Le default traite toutes les valeurs non prévues. En C#, une section non vide ne peut pas tomber implicitement dans la suivante : elle se termine généralement par break, return ou throw.
Regrouper plusieurs valeurs
Dans une instruction switch, plusieurs étiquettes peuvent partager le même traitement :
switch (choix)
{
case 2:
case 3:
Console.WriteLine("Priorité haute");
break;
}
Retourner une valeur avec switch expression
Lorsque chaque cas sert à calculer une valeur, utilisez une expression switch :
string priorite = choix switch
{
1 => "CRITIQUE",
2 or 3 => "HAUTE",
4 or 5 => "MOYENNE",
9 => "STANDARD",
_ => "INCONNUE"
};
Le symbole _ représente le cas par défaut ; c’est le même discard que l’on retrouve dans les paramètres out et les déconstructions, présenté dans le discard _ en C#. Chaque branche retourne une valeur compatible avec le type attendu.
Ajouter des conditions avec when
Le pattern matching permet de combiner structure et condition :
string niveau = montant switch
{
< 0 => "Invalide",
>= 500 when estMembre => "Premium fidélité",
>= 500 => "Premium",
>= 200 => "Standard",
_ => "Essentiel"
};
L’ordre reste important : une branche générale placée trop tôt rendrait une branche plus précise inaccessible ou inutile.
Instruction ou expression ?
| Besoin | Forme conseillée |
|---|---|
| exécuter plusieurs actions par cas | instruction switch |
| calculer une valeur | expression switch |
| tester deux possibilités simples | opérateur ternaire |
| comparer des critères indépendants | if/else |
Exemple : priorité d’un ticket
Console.Write("Choisissez un incident (1 à 5) : ");
if (!int.TryParse(Console.ReadLine(), out int choix))
{
Console.WriteLine("Saisie invalide.");
return;
}
string priorite = choix switch
{
1 => "Critique",
2 or 3 => "Haute",
4 or 5 => "Moyenne",
_ => "Inconnue"
};
Console.WriteLine($"Priorité : {priorite}");
Aller plus loin : patterns de propriété
Le pattern matching ne se limite pas aux nombres. Il peut tester les propriétés d’un objet, ce qui devient très utile avec les classes et les record :
Console.WriteLine(FraisDePort(new Commande(45m, "FR", Express: true))); // 9,90
static decimal FraisDePort(Commande commande) => commande switch
{
{ Montant: >= 100 } => 0m,
{ Pays: "FR", Express: true } => 9.90m,
{ Pays: "FR" } => 4.90m,
{ Express: true } => 19.90m,
_ => 12.50m
};
record Commande(decimal Montant, string Pays, bool Express);
Chaque branche décrit la forme des données attendues, et l’ordre compte : la livraison offerte dès 100 € s’applique avant toute autre règle. Si aucune branche ne correspond, une SwitchExpressionException est levée à l’exécution ; le compilateur avertit d’ailleurs lorsqu’un cas n’est pas couvert. Le cas _ garantit qu’aucune valeur n’est oubliée.
Exercice : jour ouvré ou week-end
À partir de DateTime.Today.DayOfWeek, affichez « Week-end » le samedi et le dimanche, « Début de semaine » le lundi et « Jour ouvré » sinon, en utilisant une seule expression switch.
Voir une solution
string description = DateTime.Today.DayOfWeek switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "Week-end",
DayOfWeek.Monday => "Début de semaine",
_ => "Jour ouvré"
};
Console.WriteLine(description);
Le pattern or regroupe deux valeurs dans une seule branche, ce qui évite de répéter le résultat.
Erreurs fréquentes
- oublier le cas par défaut lorsqu’une valeur inattendue reste possible ;
- choisir une instruction
switchuniquement pour affecter une variable ; - placer un pattern général avant un pattern plus précis ;
- surcharger une expression
switchavec des traitements ayant des effets de bord.
Épisode précédent : conditions en C#. Épisode suivant : les boucles en C#.
La série C# pour débutants
Cette série suit une progression : chaque épisode réutilise les notions des précédents.
- Variables et types
- Saisie utilisateur et TryParse
- Conditions if, else et ternaire
- Switch et pattern matching (vous êtes ici)
- Boucles for, while et foreach
- Tableaux, listes, dictionnaires et LINQ
- Méthodes, paramètres et surcharges
Une fois ces bases acquises, le parcours C# et ASP.NET Core prolonge la série vers les API web, la validation et l’asynchrone.