NULL-bedingte Operatoren (C# und Visual Basic)

Wird für eine Prüfung auf null verwendet, bevor Sie eine Operation für den Memberzugriff (?.) oder die Indizierung (?[) ausführen. Mithilfe dieser Operatoren müssen Sie für die Prüfung auf null weniger Code schreiben, insbesondere beim tieferen Eindringen in Datenstrukturen.

int? length = customers?.Length; // null if customers is null   
Customer first = customers?[0];  // null if customers is null  
int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null  
Dim length = customers?.Length  ' null if customers is null  
Dim first as Customer = customers?(0)  ' null if customers is null  
Dim count as Integer? = customers?(0)?.Orders?.Count()  ' null if customers, the first customer, or Orders is null  

Im letzten Beispiel wird veranschaulicht, dass die Null-Bedingungsoperatoren Kurzschlussoperatoren sind. Wenn ein Vorgang in einer Kette von bedingten Memberzugriffs- und Indexvorgängen null zurückgibt, wird die restliche Ausführung der Kette angehalten. Andere Vorgänge mit niedrigerer Rangfolge im Ausdruck werden fortgesetzt. Beispielsweise wird E im Folgenden immer ausgeführt, und die ??- und ==-Vorgänge werden ausgeführt.

A?.B?.C?[0] ?? E  
A?.B?.C?[0] == E  
A?.B?.C?(0) ?? E  
A?.B?.C?(0) == E  

Ein weiterer Verwendungszweck für den Null-Bedingungsmemberzugriff ist das Aufrufen von Delegaten auf threadsichere Weise mit viel weniger Code. Die bisherige Methode erfordert Code wie den folgenden:

var handler = this.PropertyChanged;  
if (handler != null)  
    handler(…);
Dim handler = AddressOf(Me.PropertyChanged)  
If handler IsNot Nothing  
    Call handler(…)  

Die neue Methode ist viel einfacher:

PropertyChanged?.Invoke(e)  
PropertyChanged?.Invoke(e)

Die neue Methode ist threadsicher, da der Compiler Code zum Auswerten von PropertyChanged nur einmal generiert und das Ergebnis in einer temporären Variablen behält.

Sie müssen die Invoke-Methode explizit aufrufen, da es keine Aufrufsyntax für Null-Bedingungsdelegate gibt PropertyChanged?(e). Es gab zu viele mehrdeutige Analysesituationen.

Sprachspezifikationen

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Weitere Informationen finden Sie in der Sprachreferenz für Visual Basic.

Siehe auch

?? (Nullzusammensetzungsoperator)
C#-Referenz
C#-Programmierhandbuch
Sprachreferenz zu Visual Basic
Visual Basic-Programmierhandbuch