Bagikan melalui


?? dan ??= operator - operator gabungan nol

Operator ?? null-coalescing mengembalikan nilai dari operand sebelah kiri jika operand tersebut tidak null; jika tidak, operator tersebut mengevaluasi operand sebelah 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.

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 ??= dapat 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
    
  • Saat 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 adalah null:

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

    Gunakan metode Nullable<T>.GetValueOrDefault() jika nilai tipe nullable null harus menjadi nilai default dari tipe nilai yang mendasar.

  • 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 berwujud ekspresi untuk menentukan 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 tentang ?? operator, lihat Bagian operator coalescing null dari spesifikasi bahasa C#.

Untuk informasi selengkapnya tentang ??= operator, lihat catatan proposal fitur.

Lihat juga