Erweiterte Mustererkennung in C#

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.