?? Ve?? = işleçler - null birleşim işleçleri
Null birleşim işleci ??
, değilse sol tarafındaki işlenenin null
değerini döndürür; aksi takdirde sağ işleneni değerlendirir ve sonucunu döndürür. ??
Sol işlenen null olmayan olarak değerlendirilirse işleç sağ işlenenini değerlendirmez. Null birleşim atama işleci ??=
, sağ işleneninin değerini yalnızca soldaki işlenen olarak değerlendirilirse sol işlenenine null
atar. ??=
Sol işlenen null olmayan olarak değerlendirilirse işleç sağ işlenenini değerlendirmez.
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.
ve ??=
işleçlerinin sol tarafındaki işlenen 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 yararlı olabilir:
null-koşullu işleçleri
?.
ve?[]
olan ifadelerde, null koşullu işlemlernull
içeren ifadenin sonucunun olması durumunda değerlendirilecek alternatif bir ifade sağlamak için işlecini kullanabilirsiniz??
: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 olması
null
durumunda belirtecek değeri belirtmek 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 temel değer türünün varsayılan değeri
null
olduğunda kullanılacak değerse yöntemini kullanın.Bağımsız değişken denetimi kodunu daha kısa hale getirmek için bir ifadeyi işlecin sağ işleneni olarak kullanabilirsiniz
throw
:??
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.
formun
??=
kodunu değiştirmek için işlecini kullanabilirsinizif (variable is null) { variable = expression; }
aşağıdaki kodla:
variable ??= expression;
İşleç aşırı yüklenebilirliği
ve işleçleri ??
??=
aşırı yüklenemez.
C# dili belirtimi
işleci hakkında ??
daha fazla bilgi için C# dil belirtiminin null birleşim işleci bölümüne bakın.
operatör hakkında ??=
daha fazla bilgi için özellik teklifi notu'na bakın.