| title | Null-conditional Operators (C# and Visual Basic) | |
|---|---|---|
| ms.date | 07/20/2015 | |
| ms.prod | .net | |
| ms.technology |
|
|
| ms.topic | article | |
| ms.assetid | 9c7b2c8f-a785-44ca-836c-407bfb6d27f5 | |
| caps.latest.revision | 3 | |
| author | BillWagner | |
| ms.author | wiwagn |
Used to test for null before performing a member access (?.) or index (?[) operation. 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 The last example demonstrates that the null-condition operators are short-circuiting. If one operation in a chain of conditional member access and index operation returns null, then the rest of the chain’s execution stops. Other operations with lower precedence in the expression continue. For example, E in the following executes in the second line, and the ?? and == operations execute. In the first line, the ?? short circuits and E does not execute when the left side evaluates to non-null.
A?.B?.C?[0] ?? E
A?.B?.C?[0] == E A?.B?.C?(0) ?? E
A?.B?.C?(0) == E Another use for the null-condition member access is invoking delegates in a thread-safe way with much less code. 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(…) The new way is much simpler:
PropertyChanged?.Invoke(e) PropertyChanged?.Invoke(e)The new way is thread-safe because the compiler generates code to evaluate PropertyChanged one time only, keeping the result in a temporary variable.
You need to explicitly call the Invoke method because there is no null-conditional delegate invocation syntax PropertyChanged?(e). There were too many ambiguous parsing situations to allow it.
[!INCLUDECSharplangspec]
For more information, see the Visual Basic Language Reference.
?? (null-coalescing operator)
C# Reference
C# Programming Guide
Visual Basic Language Reference
Visual Basic Programming Guide