Anotasi menentukan apa yang boleh kosong, tetapi compiler juga perlu tahu kapan sebuah nilai benar-benar sudah terisi. Untuk itu compiler menjalankan null-state analysis: pelacakan keadaan variabel baris demi baris mengikuti alur program. Keadaan yang dilacak ada dua, yaitu mungkin-kosong (maybe-null) dan pasti-terisi (not-null). Bab ini menunjukkan kapan keadaan berubah dan warning apa yang muncul bila analisis ditembus.

Dua Keadaan yang Dilacak Compiler #

TindakanEfek pada state
Penugasan nilai non-nullState menjadi pasti-terisi
Pemeriksaan is not null atau != nullState naik di dalam cabang yang lolos
Pembacaan dari API bertipe T?State menjadi mungkin-kosong
Dereferensi pertama pada nilai mungkin-kosongSetelah baris itu, state dianggap pasti-terisi

Baris terakhir pada tabel di atas sering mengejutkan: compiler berasumsi program hanya sampai ke baris berikutnya bila dereferensi berhasil, sehingga dua dereferensi berurutan hanya memunculkan satu warning.

Contoh: Pemeriksaan yang Menenangkan Compiler #

csharp
string? CariKodePromo(string produk)
{
    return produk == "Kopi Gayo" ? "PROMO10" : null;
}

string? kodeKopi = CariKodePromo("Kopi Gayo");
string? kodeTeh = CariKodePromo("Teh Melati");

if (kodeKopi is not null)
{
    Console.WriteLine($"Kode kopi: {kodeKopi.Length} karakter");
}

Console.WriteLine($"Kode teh: {kodeTeh ?? "(tidak ada promo)"}");

string? kota = null;
kota = "Semarang";

Console.WriteLine($"Kota setelah ditetapkan: {kota.ToUpperInvariant()}");

Output yang Dihasilkan:

text
Kode kopi: 7 karakter
Kode teh: (tidak ada promo)
Kota setelah ditetapkan: SEMARANG

Mari kita bedah baris demi baris:

  1. if (kodeKopi is not null): Pemeriksaan pola mengangkat state kodeKopi di dalam blok, sehingga kodeKopi.Length bebas warning.
  2. kodeTeh ?? "(tidak ada promo)": Variabel ini tidak pernah diperiksa, sehingga compiler tetap menganggapnya mungkin-kosong dan kita memberi pengganti.
  3. string? kota = null;: State awal mungkin-kosong sesuai penugasan.
  4. kota = "Semarang";: Penugasan nilai non-null mengangkat state menjadi pasti-terisi.
  5. kota.ToUpperInvariant(): Karena state sudah pasti-terisi, akses anggota ini bebas warning tanpa pemeriksaan tambahan.

Warning yang Muncul Bila Analisis Ditembus #

Probe berikut meneruskan variabel mungkin-kosong ke parameter non-nullable lalu mendereferensinya (path project dipangkas):

text
Program.cs(4,8): warning CS8604: Possible null reference argument for parameter 'teks' in 'void Proses(string teks)'.
Program.cs(5,19): warning CS8602: Dereference of a possibly null reference.

CS8604 menandai argumen yang mungkin kosong, dan CS8602 menandai dereferensi yang berisiko. Bukti perilaku baris terakhir tabel dapat kita uji dengan dua dereferensi berurutan pada variabel yang sama; compiler hanya memancarkan satu CS8602 untuk dereferensi pertama:

text
Program.cs(2,19): warning CS8602: Dereference of a possibly null reference.