Was bedeutet x? .Y? .Z?

68

Die Entwurfsspezifikation für die Musterübereinstimmung in C # enthält das folgende Codebeispiel:

Type? v = x?.y?.z; 
if (v.HasValue) {
    var value = v.GetValueOrDefault();     
    // code using value 
} 

Ich verstehe , dass Type?zeigt an, dass TypeNULL - Werte zulässt, aber unter der Annahme x, yund zsind Einheimische, was tut x?.y?.zbedeuten?

tkocmathla
quelle
11
nullcheck ich nehme an ..
ddavison
Hat jemand einen anderen Link für diese Entwurfsspezifikation "Pattern Matching in C #", der sich nicht auf einem MSN OneDrive befindet? Die Verbindung ist hinter einigen Unternehmens-Proxys unterbrochen. :(
RLH

Antworten:

97

Beachten Sie, dass diese Sprachfunktion nur in C # 6 und höher verfügbar ist.

Es ist effektiv das Äquivalent von:

x == null ? null
   : x.y == null ? null
   : x.y.z

Mit anderen Worten, es ist eine "sichere" Methode x.y.z, bei der eine der Eigenschaften auf dem Weg null sein kann.

Ebenfalls verwandt ist der Null-Koaleszenz-Operator (??) , der Werte zum Ersetzen bereitstellt null.

StriplingWarrior
quelle
66
Ich habe
ewig darauf
12
Es ist erwähnenswert, dass xy ​​nur einmal mit der neuen Syntax, aber zweimal mit dem aktuellen Äquivalent ausgewertet wird (vorausgesetzt, x und xy sind nicht null).
Petelids
3
Der Einzug macht es schwierig, Ihre Antwort zu lesen. Ich würde den Doppelpunkt in derselben Spalte wie das passende Fragezeichen einrücken.
Kay
2
@ Kay: Wenn der Styleguide so funktioniert, kannst du es gerne tun, wie du willst. :-)
StriplingWarrior
2
@RevanProdigalKnight Es ist nicht für Java 8 und Java 9 geplant, also denke ich in den nächsten 10 Jahren.
Om-Nom-Nom
29

Es ist ein Null-Propagationsoperator / Null-Bedingungsoperator? eine neue vorgeschlagene Funktion in C # 6.0

x?.y?.z meint

  • Überprüfen Sie zuerst, ob xnicht null ist, und überprüfen Sie y andernfalls , ob null zurückgegeben wird.
  • Zweitens, wenn x nicht null ist, überprüfen Sie y, ob es nicht null ist, und geben Sie zandernfalls null zurück.

Der endgültige Rückgabewert ist zoder null.

Ohne diesen Operator, wenn er xnull ist, x.ywürde der Zugriff eine Nullreferenzausnahme auslösen. Der nullbedingte Operator hilft dabei, eine explizite Überprüfung auf null zu vermeiden.

Auf diese Weise können Sie eine Nullreferenzausnahme vermeiden.

Siehe: Machen Sie sich mit den bevorstehenden Sprachfunktionen in C # vertraut

8 - Nullbedingte Operatoren

Manchmal neigt Code dazu, bei der Nullprüfung etwas zu ertrinken. Mit dem nullbedingten Operator können Sie nur dann auf Elemente und Elemente zugreifen, wenn der Empfänger nicht null ist. Andernfalls erhalten Sie ein Null-Ergebnis:

int? length = customers?.Length; // null if customers is null
Habib
quelle
Ich würde hinzufügen, dass dies eine C # 6-Funktion ist.
siehe
5
@tkocmathla Nein, ??ist ganz anders: x ?? yist wie x != null ? x : y. Und x?.yist wie x != null ? x.y : null.
Tim S.
@ Tim S. Danke, nette Erklärung.
Tkocmathla
1
@Habib Es ist immer noch falsch "wenn x nicht null ist, gib y zurück, sonst gib null zurück". Dies gibt nicht y zurück, sondern entweder xyz oder null.
Mclaassen
1
@mclaassen, vielleicht erkläre ich, wenn ich sie in zwei verschiedenen Schritten betrachte. Der endgültige Rückgabewert wäre entweder zodernull
Habib
2
 this.SlimShadies.SingleOrDefault(s => s.IsTheReal)?.PleaseStandUp();

Grundsätzlich.

Phil
quelle