Aracılığıyla paylaş


?? and ??= işleçleri - null birleşim işleçleri

Null birleşim işleci ?? , değilse nullsol tarafındaki işlenenin değerini döndürür. Aksi takdirde sağ işleneni değerlendirir ve sonucunu döndürür. Eğer sol operand null değilse, ?? operatörü sağ operandı kontrol etmez. Null birleşim atama işleci ??= , sağ işleneninin değerini yalnızca soldaki işlenen olarak değerlendirilirse sol işlenenine nullatar. Eğer sol operand null değilse, ??= operatörü sağ operandı kontrol etmez.

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

İşlecin sol işleneni ??= bir değişken, özellik veya dizin oluşturucu öğesi olmalıdır.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

?? ve ??= işleçlerinin sol taraftaki işlenenin türü null atanamaz bir değer türü olamaz. Özellikle null birleşim işleçlerini kısıtlanmamış tür parametreleriyle kullanabilirsiniz:

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

Null birleşim işleçleri doğru ilişkilendirilir. Yani, formun ifadeleri

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

olarak değerlendirilir

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

Örnekler

?? ve ??= işleçleri aşağıdaki senaryolarda kullanışlıdır:

  • null koşullu işleçleri ?. ve ?[]kullanan ifadelerde, null koşullu işlemler nulliçeren ifadenin sonucunun olup olmadığını değerlendirmek üzere alternatif bir ifade sağlamak için işlecini kullanın??:

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • Boş değer atanabilir değer türleriyle çalıştığınızda ve temel alınan değer türünde bir değer sağlamanız gerektiğinde, null değer atanabilir bir değer ise belirtecek değeri nullbelirtmek için işlecini kullanın??:

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

    Nullable<T>.GetValueOrDefault() Null değer atanabilir bir değer olduğunda kullanılacak değer temel değer türünün varsayılan değeriyse null yöntemini kullanın.

  • Bağımsız değişken denetimi kodunu daha kısa hale getirmek için işlecin sağ işleneni ?? olarak bir throw ifade kullanın:

    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 ifade gövdeli üyelerin nasıl kullanılacağı da gösterilmektedir.

  • Aşağıdaki formun ??= kodunu değiştirmek için işlecini kullanın:

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

    Aşağıdaki kodu kullanın:

    variable ??= expression;
    

İşleç aşırı yüklenebilirliği

ve ??= işleçlerini ?? aşırı yükleyemezsiniz.

C# dil belirtimi

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

işleç hakkında ??= daha fazla bilgi için C# dil belirtiminin Bileşik atama bölümüne bakın.

Ayrıca bakınız