次の方法で共有


?? と ??= 演算子 - null 合体演算子

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 結合演算子のセクションを参照してください。

??=演算子の詳細については、機能提案のメモを参照してください。

こちらも参照ください