Les fondamentaux de C# : Le Pattern Matching dans C# 12
Le "Pattern matching" (filtrage par motif) est l'une des fonctionnalités les plus puissantes introduites dans les versions récentes de C#. Il vous permet de vérifier si un objet donné possède une structure particulière et d'en extraire des données le cas échéant. Voyons comment cela peut rendre votre logique beaucoup plus concise.
L'instruction switch classique vs le Pattern Matching
Dans les anciennes versions de C#, gérer différents types ou des conditions complexes nécessitait de longues chaînes de blocs if/else ou des instructions switch assez limitées. Avec les expressions switch modernes de C# et les motifs de propriétés (property patterns), le code devient déclaratif.
Motifs de propriétés (Property Patterns)
Imaginons que nous avons un modèle e-commerce et que nous souhaitons calculer une remise en fonction du type de client et du montant total de ses achats :
public record Customer(string Tier, decimal TotalPurchases);
public decimal CalculateDiscount(Customer customer) => customer switch
{
{ Tier: "VIP", TotalPurchases: > 1000m } => 0.20m,
{ Tier: "VIP" } => 0.15m,
{ Tier: "Regular", TotalPurchases: > 500m } => 0.10m,
{ Tier: "Regular" } => 0.05m,
_ => 0m
};
Motifs relationnels et logiques
Vous pouvez également utiliser des opérateurs relationnels (>, <, >=, <=) et des opérateurs logiques (and, or, not) directement au sein de vos correspondances.
public string GetWeatherAdvice(int temperatureCelsius) => temperatureCelsius switch
{
< 0 => "Glacial ! Portez un manteau chaud.",
>= 0 and < 15 => "Frais. Une veste est recommandée.",
>= 15 and < 25 => "Doux. Le temps idéal pour un petit pull.",
>= 25 => "Chaud ! Hydratez-vous bien.",
};
Motifs de liste (introduits dans C# 11)
Les motifs de liste (List patterns) vous permettent d'effectuer correspondre des séquences d'éléments. Vous pouvez vérifier la longueur, spécifier des éléments à certaines positions, ou utiliser le motif slice .. pour capturer n'importe quel nombre d'éléments.
public string ProcessCommand(string[] args) => args switch
{
[] => "Aucun argument fourni.",
["help"] => "Affichage du menu d'aide...",
["run", ..] => "Exécution du programme avec des paramètres supplémentaires.",
["test", var testName] => $"Exécution du test : {testName}",
_ => "Commande inconnue."
};
Le Pattern matching modifie profondément votre façon d'aborder le flux de contrôle en C#, vous éloignant des boucles et conditions impératives au profit de déclarations élégantes et fonctionnelles.
S'abonner à la newsletter
Recevez un e-mail à chaque fois que je publie un nouvel article sur l'ingénierie logicielle, l'architecture et .NET. Jamais de spam.