?.?. および ?[] Null 条件演算子 (C# および Visual Basic)and ?[] null-conditional Operators (C# and Visual Basic)

メンバー アクセス (?.) またはインデックス (?[]) 操作を実行する前に、左の演算子の値を null に対してテストします。左側のオペランドが null に評価される場合、null が返されます。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.

これらの演算子を使用すると、null チェックの処理のために記述するコードを少なくすることができます (特に、データ構造を下っていく場合)。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  

Null 条件演算子はショートサーキットです。The null-conditional operators are short-circuiting. 条件付きのメンバー アクセスやインデックス操作のチェーンの 1 つの演算が null を返す場合、チェーンの実行の残りの部分は停止します。If one operation in a chain of conditional member access and index operations returns null, the rest of the chain’s execution stops. 次の例では、AB、または C が null と評価された場合、E は実行されません。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];

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:

PropertyChanged?.Invoke(…)  

コンパイラが PropertyChanged を評価するためのコードを一度しか生成せず、一時変数に結果が保持されるため、新しい方法はスレッド セーフです。The new way is thread-safe because the compiler generates code to evaluate PropertyChanged one time only, keeping the result in a temporary variable. null 条件デリゲート呼び出し構文 PropertyChanged?(e) がないため、Invoke メソッドを明示的に呼び出す必要があります。You need to explicitly call the Invoke method because there is no null-conditional delegate invocation syntax PropertyChanged?(e).

言語仕様Language Specifications

詳細については、「C# 言語仕様」の「Null 条件演算子」をご覧ください。For more information, see Null-conditional operator in the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

参照See Also