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 #
| Tindakan | Efek pada state |
|---|---|
| Penugasan nilai non-null | State menjadi pasti-terisi |
Pemeriksaan is not null atau != null | State naik di dalam cabang yang lolos |
Pembacaan dari API bertipe T? | State menjadi mungkin-kosong |
| Dereferensi pertama pada nilai mungkin-kosong | Setelah 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 #
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:
Kode kopi: 7 karakter
Kode teh: (tidak ada promo)
Kota setelah ditetapkan: SEMARANGMari kita bedah baris demi baris:
if (kodeKopi is not null): Pemeriksaan pola mengangkat statekodeKopidi dalam blok, sehinggakodeKopi.Lengthbebas warning.kodeTeh ?? "(tidak ada promo)": Variabel ini tidak pernah diperiksa, sehingga compiler tetap menganggapnya mungkin-kosong dan kita memberi pengganti.string? kota = null;: State awal mungkin-kosong sesuai penugasan.kota = "Semarang";: Penugasan nilai non-null mengangkat state menjadi pasti-terisi.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):
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:
Program.cs(2,19): warning CS8602: Dereference of a possibly null reference.