?? Ve?? = işleçler (C# başvurusu)

Null-coalescing işleci, değilse sol işlenenin değerini döndürür; aksi takdirde, sağ işleneni değerlendirir ve ?? null sonucu döndürür. Sol işlenen null olmayan olarak değerlendirilirse işleç, sağ ?? işlenenini değerlendirmez.

C# 8.0 ve üzerinde kullanılabilir, null birikerek atama işleci sağ işlenenin değerini yalnızca sol işlenen olarak değerlendirilirse sol işlenene ??= null atar. Sol işlenen null olmayan olarak değerlendirilirse işleç, sağ ??= işlenenini değerlendirmez.

List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

İşlecinin sol işleneni ??= bir değişken, özellik veya dizinöğesi olması gerekir.

C# 7.3 ve önceki sürümlerinde işlecinin sol işlenen türü bir başvuru türü veya null değer değer türü ?? olmalıdır. C# 8.0'dan itibaren bu gereksinim aşağıdakilerle değiştirilir: ve işleçlerinin sol işlenen türü null değere sahip olmayan bir değer ?? ??= türü olamaz. Özellikle, C# 8.0'dan başlayarak, kısıtlanmamış tür parametreleriyle null-coalescing işleçlerini kullanabilirsiniz:

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

Null-coalescing işleçleri, doğru bir şekilde irdeler. Diğer bir ifade, formun ifadeleridir

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

olarak değerlendirilir

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

Örnekler

ve ?? ??= işleçleri aşağıdaki senaryolarda yararlı olabilir:

  • null-koşullu işleçleri ?. ve ?[]olan ifadelerde, ifadenin null koşullu işlemlerle sonuçlansa değerlendirilecek alternatif bir ifade sağlamak için işleci ?? null kullanabilirsiniz:

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • Null değere değiştirilebilir değer türleriyle birlikte çalışıyor ve temel alınan bir değer türünün değerini belirtmeniz gerekirken, null değere değiştirilebilir bir değer olduğunda sağlamak üzere değeri belirtmek için ?? işleci null kullanın:

    int? a = null;
    int b = a ?? -1;
    Console.WriteLine(b);  // output: -1
    

    Null değere sahip bir değer, temel alınan değer türünün varsayılan değeri olduğunda kullanılacak Nullable<T>.GetValueOrDefault() null değer ise yöntemini kullanın.

  • C# 7.0'dan itibaren, throw bağımsız değişken denetleme kodunu daha kısa hale etmek için işlecinin sağ işleneni olarak bir ?? ifade kullanabilirsiniz:

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
    }
    

    Yukarıdaki örnekte, bir özelliği tanımlamak için ifadeye göre sıralandırmış üyelerin nasıl kullanılagelmektedir.

  • C# 8.0'dan itibaren, formun kodunu ??= değiştirmek için işleci kullanabilirsiniz

    if (variable is null)
    {
        variable = expression;
    }
    

    aşağıdaki kodla:

    variable ??= expression;
    

İşleç aşırı yüklemesi

ve ?? ??= işleçleri aşırı yük olamaz.

C# dili belirtimi

işleci hakkında daha fazla ?? bilgi için C# dil belirtimlerinin Null birikmesi işleci bölümüne bakın.

işleci hakkında daha fazla ??= bilgi için özellik teklifi notuna bakın.

Ayrıca bkz.