?.?. und ?[]: NULL-bedingte Operatoren (C# und Visual Basic)and ?[] null-conditional Operators (C# and Visual Basic)

Diese Operatoren testen, ob der Wert des linken Operanden NULL ist, bevor ein Memberzugriffs- (?.) oder Indexzugriffsvorgang (?[]) ausgeführt wird. Sie geben null zurück, wenn der linke Operand null ergibt.Tests the value of the left-hand operand for null before performing a member access (?.) or index (?[]) operation; returns null if the left-hand operand evaluates to null.

Mithilfe dieser Operatoren müssen Sie für die Prüfung auf null weniger Code schreiben, insbesondere beim tieferen Eindringen in Datenstrukturen.These operators help you write less code to handle null checks, especially for descending into data structures.

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  

Die NULL-bedingten Operatoren sind Kurzschlussoperatoren.The null-conditional operators are short-circuiting. Wenn ein Vorgang in einer Kette von bedingten Memberzugriffs- und Indexvorgängen null zurückgibt, wird die restliche Ausführung der Kette angehalten.If one operation in a chain of conditional member access and index operation returns null, then the rest of the chain’s execution stops. Im folgenden Beispiel wird E nicht ausgeführt, wenn das Ergebnis der Auswertung von A, B oder C NULL ist.In the following example, E doesn't execute if A, B, or C evaluates to null.

A?.B?.C?.Do(E);
A?.B?.C?[E];
A?.B?.C?.Do(E);
A?.B?.C?(E);

Ein weiterer Verwendungszweck für den NULL-bedingten Memberzugriff ist das Aufrufen von Delegaten auf threadsichere Weise mit viel weniger Code.Another use for the null-conditional member access is invoking delegates in a thread-safe way with much less code. Die bisherige Methode erfordert Code wie den folgenden:The old way requires code like the following:

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:The new way is much simpler:

PropertyChanged?.Invoke(…)  
PropertyChanged?.Invoke(…)

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.The new way is thread-safe because the compiler generates code to evaluate PropertyChanged one time only, keeping the result in a temporary variable. Sie müssen die Invoke-Methode explizit aufrufen, da es keine Aufrufsyntax für Null-Bedingungsdelegate gibt PropertyChanged?(e).You need to explicitly call the Invoke method because there is no null-conditional delegate invocation syntax PropertyChanged?(e).

SprachspezifikationenLanguage Specifications

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.The language specification is the definitive source for C# syntax and usage.

Weitere Informationen finden Sie in der Sprachreferenz für Visual Basic.For more information, see the Visual Basic Language Reference.

Siehe auchSee Also

?? (NULL-Sammeloperator)?? (null-coalescing operator)
C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
Visual Basic-ProgrammierhandbuchVisual Basic Programming Guide