?. and ? null-conditional Operators (C# and Visual Basic)
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
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?; // null if customers is null int? count = customers??.Orders?.Count(); // null if customers, the first customer, or Orders is null
The null-conditional operators are short-circuiting. If one operation in a chain of conditional member access and index operations returns null, the rest of the chain’s execution stops. In the following example,
E doesn't execute if
C evaluates to null.
Another use for the null-conditional 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(…);
The new way is much simpler:
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