Setelah data yang mungkin kosong dibaca, kita hampir selalu butuh nilai pengganti: kupon kosong menjadi tanpa kupon, resi kosong menjadi teks penjelas. Operator null-coalescing ?? menuliskan pengganti itu dalam satu expression. Section Operator sudah menyentuh bentuk dasarnya; bab ini menekankan mekanisme evaluasi, bentuk ??=, dan rantai pengganti bertingkat.

Mekanisme dan Evaluasi Pendek #

Expression kiri ?? kanan menghasilkan kiri bila kiri tidak null, dan menghasilkan kanan bila sebaliknya. Sisi kanan dievaluasi hanya bila sisi kiri kosong, sehingga pemanggilan method atau pembuatan object di sisi kanan tidak berjalan sia-sia. Hasil expression mewarisi tipe yang lebih umum dari kedua sisi, dan bila kedua sisi non-nullable, hasilnya juga non-nullable.

Contoh: Nilai Default Alur Pesanan #

csharp
string? kodeKupon = null;
string kuponEfektif = kodeKupon ?? "TANPA-KUPON";

Console.WriteLine($"Kupon: {kuponEfektif}");

int? batasGratis = null;
int batasOngkir = batasGratis ?? 150000;

Console.WriteLine($"Batas ongkir gratis: {batasOngkir}");

string? catatan = "Diminta kemasan aman";
catatan ??= "Catatan kosong";

Console.WriteLine($"Catatan: {catatan}");

string? resi = null;
resi ??= "Resi belum tersedia";

Console.WriteLine($"Resi: {resi}");

string? kurir1 = null;
string? kurir2 = "Kurir Siang";

Console.WriteLine($"Kurir: {kurir1 ?? kurir2 ?? "Kurir Reguler"}");

Output yang Dihasilkan:

text
Kupon: TANPA-KUPON
Batas ongkir gratis: 150000
Catatan: Diminta kemasan aman
Resi: Resi belum tersedia
Kurir: Kurir Siang

Mari kita bedah baris demi baris:

  1. string kuponEfektif = kodeKupon ?? "TANPA-KUPON";: Sisi kiri kosong, sehingga hasilnya teks pengganti; variabel penerima bertipe string non-nullable.
  2. int batasOngkir = batasGratis ?? 150000;: Operator ini juga berlaku untuk nullable value type, dan hasilnya kembali menjadi int biasa.
  3. catatan ??= "Catatan kosong";: Bentuk ??= hanya menugaskan bila sisi kiri kosong. Karena catatan sudah terisi, nilai lamanya dipertahankan.
  4. resi ??= "Resi belum tersedia";: resi masih kosong, sehingga penugasan berjalan dan state variabel naik menjadi pasti-terisi.
  5. kurir1 ?? kurir2 ?? "Kurir Reguler": Rantai dibaca dari kiri; kurir1 kosong, lalu kurir2 terisi, sehingga Kurir Reguler tidak pernah dievaluasi.

??= sebagai Pengisi Sekali Jalan #

Idiom variabel ??= nilai cocok untuk data yang diisi sekali saja: konfigurasi yang dibaca malas, cache yang belum terisi, atau label bawaan. Idiom ini menggantikan blok if (variabel is null) yang membosankan dan membuat niat pengisian terlihat dalam satu baris.