Erweiterte Mustererkennung in C#
- Matt
Mit C# 8.0 und C# 9.0 hat Microsoft die Mustererkennung (Pattern Matching) deutlich ausgebaut. Diese Verbesserungen ermöglichen es Entwicklern, eleganteren und ausdrucksstärkeren Code zu schreiben. In diesem Artikel werde ich einige der fortgeschrittenen Funktionen der Mustererkennung in C# vorstellen und deren Anwendung erläutern.
Was ist Mustererkennung?
Mustererkennung ermöglicht es, den Wert einer Variablen zu prüfen und abhängig von dessen Struktur oder Eigenschaften unterschiedliche Aktionen durchzuführen. Dies ist besonders nützlich in Situationen, in denen komplexe Bedingungen überprüft werden müssen.
Neue Features in der Mustererkennung
1. Switch-Ausdrücke
Switch-Ausdrücke bieten eine kompaktere und ausdrucksstärkere Möglichkeit, Switch-Logik zu implementieren:
public static string GetSeason(Month month) => month switch
{
Month.December or Month.January or Month.February => "Winter",
Month.March or Month.April or Month.May => "Spring",
Month.June or Month.July or Month.August => "Summer",
Month.September or Month.October or Month.November => "Fall",
_ => throw new ArgumentOutOfRangeException()
};
2. Tupel-Muster
Mit Tupel-Mustern können komplexe Bedingungen in einer klaren und prägnanten Weise ausgedrückt werden:
public static string Classify(int age, bool isStudent) => (age, isStudent) switch
{
( < 18, true) => "Schüler",
( < 18, false) => "Minderjährig",
( >= 18, true) => "Student",
( >= 18, false) => "Erwachsener",
_ => "Unbekannt"
};
3. Property-Muster
Property-Muster ermöglichen die Prüfung von Eigenschaften eines Objekts direkt im Muster:
public static string GetPersonType(Person person) => person switch
{
{ Age: < 18 } => "Minderjährig",
{ Age: >= 18 } => "Erwachsener",
_ => "Unbekannt"
};
4. Logische Muster
Logische Muster wie and, or und not ermöglichen komplexere Bedingungen:
public static bool IsEligibleForDiscount(Customer customer) => customer switch
{
{ Age: < 18 } or { IsStudent: true } => true,
{ Age: >= 65 } and { IsMember: true } => true,
_ => false
};
5. Positionsmuster
Mit Positionsmustern können die Werte von Deconstruct-Methoden direkt im Muster verwendet werden:
public static string GetQuadrant(Point point) => point switch
{
(0, 0) => "Origin",
( > 0, > 0) => "First Quadrant",
( < 0, > 0) => "Second Quadrant",
( < 0, < 0) => "Third Quadrant",
( > 0, < 0) => "Fourth Quadrant",
_ => "On Axis"
};
Fazit
Pattern Matching ersetzt vor allem verschachtelte if-Kaskaden durch etwas, das man am Stück lesen kann. Überziehen lässt es sich trotzdem: Ein Switch-Ausdruck über vier Ebenen ist nicht lesbarer als die Kaskade davor.
Für weitere Details und eine ausführliche Anleitung besuche die offizielle Microsoft-Dokumentation.
Eine vollständige Übersicht aller Muster gibt es in der Referenz zu Pattern Matching.