null 合体演算子 ??
は、 null
でない場合は左側のオペランドの値を返します。それ以外の場合は、右側のオペランドを評価し、その結果を返します。 左側のオペランドが null 以外と評価される場合、??
演算子は右側のオペランドを評価しません。 null 結合代入演算子 ??=
は、左側のオペランドが null
に評価された場合にのみ、右側のオペランドの値を左側のオペランドに割り当てます。 左側のオペランドが null 以外と評価される場合、??=
演算子は右側のオペランドを評価しません。
List<int>? numbers = null;
int? a = null;
Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
Console.WriteLine((numbers is null)); // expected: false
Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
??=
演算子の左側のオペランドは、変数、プロパティ、またはインデクサー要素である必要があります。
??
演算子と??=
演算子の左側のオペランドの型を null 非許容値型にすることはできません。 特に、null 結合演算子は、制約のない型パラメーターと共に使用できます。
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
null 合体演算子は、右結合です。 つまり、フォームの式
a ?? b ?? c
d ??= e ??= f
は次のように評価されます。
a ?? (b ?? c)
d ??= (e ??= f)
例示
??
演算子と??=
演算子は、次のシナリオで役立ちます。
null 条件演算子が
?.
および?[]
された式では、??
演算子を使用して、null 条件演算を含む式の結果がnull
された場合に評価する代替式を指定できます。double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
null 許容値型を操作し、基になる値型の値を指定する必要がある場合は、
??
演算子を使用して、null 許容型の値がnull
場合に指定する値を指定します。int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
基になる値型の既定値を利用する必要がある場合には、nullable 型の値において `Nullable<T>.GetValueOrDefault()` の場合、 `
null
` メソッドを利用します。throw
演算子の右側のオペランドとしてを使用すると、引数チェック コードをより簡潔にすることができます。public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
前の例では、 式形式のメンバー を使用してプロパティを定義する方法も示しています。
??=
演算子を使用して、フォームのコードを置き換えることができます。if (variable is null) { variable = expression; }
次のコードを使用します。
variable ??= expression;
演算子のオーバーロード可能性
演算子 ??
および ??=
はオーバーロードできません。
C# 言語仕様
??
演算子の詳細については、C# 言語仕様の null 結合演算子のセクションを参照してください。
??=
演算子の詳細については、機能提案のメモを参照してください。
こちらも参照ください
.NET