Wissen von A bis Z

Pattern Matching

Wenn Ihr Code endlich lernt, Muster so schnell zu erkennen wie ein Kleinkind beim Sortierspiel.

Pattern Matching bezeichnet in C# eine Familie von Sprachfeatures, mit denen Werte auf strukturelle Muster geprüft und gleichzeitig zerlegt werden können. Statt mit verschachtelten if/else- oder switch-Konstruktionen Typen, Werte und Eigenschaften zu prüfen, werden Muster wie Type Patterns, Property Patterns, Positional Patterns, Tuple Patterns, Relational Patterns und List Patterns direkt in switch-Ausdrücken oder is-Operatoren verwendet.

Eingesetzt wird Pattern Matching in Domänenlogik (etwa wenn eine Bestellung im Status X und Betrag größer Y eine bestimmte Aktion auslösen soll), in Parsern und Tree-Walkers (Roslyn, AST-Verarbeitung), in Result-Typen mit Records, in Validierungs- und Mapping-Code sowie in Visitor-ähnlichen Strukturen. In Kombination mit Records, Tuples und Nullable-Reference-Types wird damit ein deutlich deklarativerer Stil möglich, der funktionalen Sprachen wie F#, Scala oder Rust nahekommt.

Der Einsatzzweck und das gelöste Problem liegen in der Lesbarkeit und Korrektheit von Verzweigungslogik. Klassischer C#-Code prüft Typen mit is/as und Casts, greift dann auf Properties zu und macht weitere Vergleiche; das ist fehleranfällig und schwer lesbar. Mit Pattern Matching schrumpft eine solche Sequenz auf einen einzelnen switch-Ausdruck, der gleichzeitig Compiler-Hinweise zur Vollständigkeit der Fälle (Exhaustiveness) liefert und in Verbindung mit Sealed Hierarchien oder Records bei fehlenden Fällen warnen kann.

Historisch entwickelte sich Pattern Matching schrittweise: C# 7 (2017) brachte erste Type- und Constant-Patterns sowie Out-Variablen, C# 8 (2019) Switch Expressions, Property Patterns und Recursive Patterns, C# 9 (2020) Relational Patterns und Logical Patterns (and/or/not), C# 10 (2021) Extended Property Patterns, C# 11 (2022) List Patterns und C# 12/13 weitere Verfeinerungen. Damit reiht sich C# in die Linie moderner Mainstream-Sprachen ein, die Pattern Matching als Kernfeature etablieren.

Eingeführt und konsequent ausgebaut wurde Pattern Matching vom C#-Sprachkomitee um Mads Torgersen und Neal Gafter, mit deutlichem Einfluss aus F# und Haskell. In den Sprachdesign-Notizen, die Microsoft auf GitHub öffentlich pflegt, wurde Pattern Matching über mehrere Jahre als ‚the long arc' bezeichnet — eine Roadmap, die bewusst über mehrere C#-Versionen verteilt wurde, um Akzeptanz schrittweise aufzubauen, ohne die Sprache mit zu vielen neuen Konzepten auf einmal zu überfrachten.

Zurück