Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Operator null-coalescing ?? mengembalikan nilai operand sebelah kirinya jika bukan null. Jika tidak, itu mengevaluasi operand tangan kanan dan mengembalikan hasilnya. Operator ?? tidak mengevaluasi operand kanannya jika operand kiri bernilai non-null. Operator ??= penugasan null-coalescing mengatur nilai operand di sebelah kanannya ke operand di sebelah kirinya hanya jika operand di sebelah kiri bernilai null. Operator ??= tidak mengevaluasi operand kanannya jika operand kiri bernilai 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 ??= di sebelah kiri operator harus berupa variabel, properti, atau elemen pengindeks.
Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Petunjuk / Saran
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
Jenis operand di sebelah kiri operator ?? dan ??= tidak boleh berupa tipe nilai yang tidak dapat bernilai 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 penggabung-null bersifat asosiatif ke kanan. Artinya, ekspresi dalam bentuk
a ?? b ?? c
d ??= e ??= f
dievaluasi sebagai
a ?? (b ?? c)
d ??= (e ??= f)
Contoh
Operator ?? dan ??= berguna dalam skenario berikut:
Dalam ekspresi yang menggunakan operator
?.null-conditional dan?[], gunakan??operator untuk memberikan ekspresi alternatif untuk mengevaluasi apakah 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: NaNSaat Anda bekerja dengan jenis nilai nullable dan perlu memberikan nilai dari jenis nilai yang mendasar, gunakan
??operator untuk menentukan nilai yang akan diberikan jika nilai jenis nullable adalahnull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Nullable<T>.GetValueOrDefault() Gunakan metode jika nilai yang akan digunakan saat nilai
nulljenis nullable harus menjadi nilai default dari jenis nilai yang mendasar.Untuk membuat kode pemeriksaan argumen lebih ringkas, gunakan
throwekspresi sebagai operand??sebelah kanan operator:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }Contoh sebelumnya juga menunjukkan cara menggunakan anggota berwujud ekspresi untuk menentukan properti.
??=Gunakan operator untuk mengganti kode formulir berikut:if (variable is null) { variable = expression; }Gunakan kode berikut:
variable ??= expression;
Kelebihan beban operator
Anda tidak dapat membebani ?? operator dan ??= secara berlebihan.
Spesifikasi bahasa C#
Untuk informasi selengkapnya tentang ?? operator, lihat Bagian operator coalescing null dari spesifikasi bahasa C#.
Untuk informasi selengkapnya tentang ??= operator, lihat bagian Penetapan gabungan dari spesifikasi bahasa C#.