Ada saat ketika kita tahu lebih banyak daripada compiler: data sudah diverifikasi lewat logika yang tidak terlacak analisis, atau invarian class menjamin nilai terisi. Compiler tetap memunculkan warning pada titik itu karena analisisnya konservatif. Operator null-forgiving, ditulis sebagai akhiran !, adalah cara kita menyatakan “nilai ini tidak kosong” dan menumpas warning secara sadar.
Mekanisme: Menimpa Keputusan Compiler #
Expression x! menegaskan bahwa x tidak null, sehingga state x dianggap pasti-terisi setelah titik itu. Operator ini murni anotasi untuk compiler: tidak ada pemeriksaan runtime yang ditambahkan, dan ukuran program tidak berubah. Karena itu, akhiran ! hanya boleh dipakai ketika kita bisa menjelaskan alasan kepastiannya dalam komentar atau nama method.
Contoh: Kepastian dari Logika Program #
List<string> daftarKota = new List<string> { "Bandung", "Surabaya", "Medan" };
string? dicari = daftarKota.Find(kota => kota.StartsWith("Sur"));
Console.WriteLine($"Kota: {dicari!.ToUpperInvariant()}");
string? resi = AmbilResi("ORD-3001");
if (resi != null)
{
Console.WriteLine($"Resi terisi: {resi}");
}
Console.WriteLine($"Panjang resi: {resi!.Length}");
string? AmbilResi(string nomorPesanan)
{
return nomorPesanan == "ORD-3001" ? "JX-99281" : null;
}Output yang Dihasilkan:
Kota: SURABAYA
Resi terisi: JX-99281
Panjang resi: 8Mari kita bedah baris demi baris:
daftarKota.Find(...): MethodFindmengembalikanstring?karena elemen yang cocok bisa saja tidak ada; statedicariawalnya mungkin-kosong.dicari!.ToUpperInvariant(): Kita menjamin daftar memuat kota berawalanSur, sehingga akhiran!menumpas warning CS8602 pada baris ini.if (resi != null): Di dalam blok, compiler mengangkat stateresi, sehingga pencetakan pertama bebas warning.resi!.Length: Setelah blokiftanpaelse, state kembali mungkin-kosong; akhiran!menyatakan kita tahu pemanggilanAmbilResi("ORD-3001")selalu menghasilkan resi.
Warning yang Ditumpas dan Sisanya #
Tanpa akhiran !, kode di atas memunculkan warning berikut (path project dipangkas):
Program.cs(3,28): warning CS8602: Dereference of a possibly null reference.Perhatikan bahwa hanya satu CS8602 yang muncul meski ada dua titik akses. Setelah dereferensi pertama, compiler menganggap state variabel sudah pasti-terisi, sesuai perilaku null-state analysis pada bab sebelumnya. Akhiran ! bekerja pada jalur yang sama, hanya lebih eksplisit.