?? Dan?? = operator - operator null-coalescing
Operator ??
null-coalescing mengembalikan nilai operand sebelah kirinya jika tidaknull
; sebaliknya, operator tersebut mengevaluasi operand sebelah kanan serta mengembalikan hasilnya. Operator ??
tidak mengevaluasi operand kanannya apabila operand sebelah kiri mengevaluasi ke non-null. Operator ??=
penugasan null-coalescing menetapkan nilai operand tangan kanannya ke operand sebelah kirinya hanya jika operand sebelah kiri mengevaluasi ke null
. Operator ??=
tidak mengevaluasi operand kanannya apabila operand sebelah kiri mengevaluasi ke non-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
Operand ??=
sebelah kiri operator harus berupa variabel, properti, atau sebuah elemen pengindeks.
Jenis operand ??
sebelah kiri operator dan ??=
tidak boleh berupa jenis nilai yang tidak dapat diubah ke null. Secara khusus, Anda dapat menggunakan operator null-coalescing dengan parameter jenis yang tidak dibatasi:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Operator null-coalescing bersifat asosiatif kanan. Artinya, ekspresi dari formulir
a ?? b ?? c
d ??= e ??= f
dievaluasi sebagai
a ?? (b ?? c)
d ??= (e ??= f)
Contoh
Operator ??
dan ??=
bisa berguna dalam skenario berikut:
Dalam ekspresi dengan operator null-conditional dan
?[]
, Anda dapat menggunakan??
operator untuk memberikan ekspresi alternatif untuk dievaluasi jika hasil ekspresi dengan operasi null-conditional adalahnull
?.
:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
Ketika Anda bekerja dengan jenis nilai yang dapat diubah ke null dan perlu memberikan nilai dari jenis nilai yang mendasar, gunakan operator
??
untuk menentukan nilai yang akan diberikan jika nilai jenis yang bisa diubah ke null adalahnull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Gunakan metode Nullable<T>.GetValueOrDefault() jika nilai yang akan digunakan saat nilai jenis yang dapat diubah ke null
null
harus menjadi nilai default dari jenis nilai yang mendasarinya.Anda dapat menggunakan
throw
ekspresi sebagai operand??
kanan operator untuk membuat kode pemeriksaan argumen lebih ringkas:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
Contoh sebelumnya juga menunjukkan cara menggunakan anggota berisi ekspresi untuk menentukan sebuah properti.
Anda dapat menggunakan
??=
operator untuk mengganti kode formulirif (variable is null) { variable = expression; }
dengan kode berikut:
variable ??= expression;
Kelebihan beban operator
Operator ??
dan ??=
tidak dapat kelebihan beban.
Spesifikasi bahasa C#
Untuk informasi selengkapnya mengenai ??
operator, lihat Bagian operator coalescing null dari spesifikasi bahasa C#.
Untuk informasi selengkapnya tentang operator ??=
, lihat catatan proposal fitur.