Erweiterte Mustererkennung in C#

Erweiterte Mustererkennung in C#

30 Nov 2022 - Matthias Voigt

Mit der Einführung von C# 8.0 und C# 9.0 hat Microsoft die Mustererkennung (Pattern Matching) in der Sprache erheblich erweitert. 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

Die erweiterten Funktionen der Mustererkennung in C# bieten Entwicklern eine leistungsstarke Möglichkeit, komplexe Bedingungen und Logik klar und prägnant auszudrücken. Durch die Nutzung von Switch-Ausdrücken, Tupel-Mustern, Property-Mustern und logischen Mustern kann der Code lesbarer und wartbarer gestaltet werden. Es lohnt sich, diese neuen Features in zukünftigen Projekten zu erkunden und zu nutzen.

Für weitere Details und eine ausführliche Anleitung besuche die offizielle Microsoft-Dokumentation.