Bagikan melalui


?? 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 adalah null?. :

    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 adalah null:

    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 formulir

    if (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.

Lihat juga