共用方式為


?? 和 ??= 運算子 - 空值合併運算子

空合併運算子 ?? 會返回其左側運算元的值,如果不是 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 的實值型別。 特別是,您可以將空合併運算子用於無限制的類型參數。

private static void Display<T>(T a, T backup)
{
    Console.WriteLine(a ?? backup);
}

空合併運算子是右關聯運算子。 也就是說,表單的表達式

a ?? b ?? c
d ??= e ??= f

被評估為

a ?? (b ?? c)
d ??= (e ??= f)

範例

????= 運算子在下列案例中很有用:

  • 在包含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<T>.GetValueOrDefault()方法,如果可為 Null 的型別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# 語言規格中的一節:空聯合運算子

如需運算子 ??= 的詳細資訊,請參閱 功能提案附註

另請參閱