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.
Language Specifications
For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.
For more information, see the Visual Basic Language Reference.
See Also
?? (null-coalescing operator)
C# Reference
C# Programming Guide
Visual Basic Language Reference
Visual Basic Programming Guide




