Freigeben über


Erweiterte Eigenschaftenmuster

Anmerkung

Dieser Artikel ist eine Featurespezifikation. Die Spezifikation dient als Designdokument für das Feature. Es enthält vorgeschlagene Spezifikationsänderungen sowie Informationen, die während des Entwurfs und der Entwicklung des Features erforderlich sind. Diese Artikel werden veröffentlicht, bis die vorgeschlagenen Spezifikationsänderungen abgeschlossen und in die aktuelle ECMA-Spezifikation aufgenommen werden.

Es kann einige Abweichungen zwischen der Featurespezifikation und der abgeschlossenen Implementierung geben. Diese Unterschiede werden in den entsprechenden Hinweisen zum Language Design Meeting (LDM) erfasst.

Weitere Informationen zum Einführen von Featurespezifikationen in den C#-Sprachstandard finden Sie im Artikel zu den Spezifikationen.

Champion Issue: https://github.com/dotnet/csharplang/issues/4394

Zusammenfassung

Sie bieten beispielsweise die Möglichkeit, eingebettete Mitglieder mit Eigenschaftsuntermustern zu referenzieren:

if (e is MethodCallExpression { Method.Name: "MethodName" })

Anstelle von:

if (e is MethodCallExpression { Method: { Name: "MethodName" } })

Motivation

Wenn Sie eine untergeordnete Eigenschaft abgleichen wollen, fügt das Einbetten eines weiteren rekursiven Musters zu viel Chaos hinzu, was der Lesbarkeit schadet und keinen wirklichen Vorteil bringt.

Detailentwurf

Die Syntax property_pattern wird wie folgt geändert:

property_pattern
  : type? property_pattern_clause simple_designation?
  ;

property_pattern_clause
  : '{' (subpattern (',' subpattern)* ','?)? '}'
  ;

subpattern
- : identifier ':' pattern
+ : subpattern_name ':' pattern
  ;

+subpattern_name
+ : identifier 
+ | subpattern_name '.' identifier
+ ;

Der Empfänger für jeden Name-Lookup ist der Typ des vorhergehenden Mitglieds T0, beginnend mit dem Eingabetyp des Eigenschaftsmusters. wenn T- ein nullabler Typ ist, ist T0 der zugrunde liegende Typ, andernfalls ist T0- gleich T.

Ein Muster des Formulars { Prop1.Prop2: pattern } entspricht beispielsweise genau { Prop1: { Prop2: pattern } }.

Beachten Sie, dass dies die NULL-Prüfung enthält, wenn T ein Nullwerttyp oder ein Bezugstyp ist. Diese NULL-Überprüfung bedeutet, dass die verfügbaren geschachtelten Eigenschaften die Eigenschaften von T0und nicht von Tsind.

Wiederholte Pfade der Mitglieder sind zugelassen. Die Kompilierung des Musterabgleichs kann gemeinsame Teile von Mustern nutzen.