C#.NETDébutantPattern MatchingTutoriel

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.

Yva Hajatiana
15 octobre 2017
4 min de lecture
Partager :X / TwitterLinkedIn
Composition éditoriale abstraite sur les fondamentaux de C#

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 ?

BesoinForme conseillée
exécuter plusieurs actions par casinstruction switch
calculer une valeurexpression switch
tester deux possibilités simplesopérateur ternaire
comparer des critères indépendantsif/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 switch uniquement pour affecter une variable ;
  • placer un pattern général avant un pattern plus précis ;
  • surcharger une expression switch avec 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.

  1. Variables et types
  2. Saisie utilisateur et TryParse
  3. Conditions if, else et ternaire
  4. Switch et pattern matching (vous êtes ici)
  5. Boucles for, while et foreach
  6. Tableaux, listes, dictionnaires et LINQ
  7. 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.

Mots-clés :C#.NETDébutantPattern MatchingTutoriel
Y

Yva Hajatiana

Lead développeur .NET à Paris et architecte logiciel, 10 ans d'expérience sur des SI critiques bancaires (.NET, Angular, systèmes distribués, IAM, DevOps).