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 #

csharp
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:

text
Kota: SURABAYA
Resi terisi: JX-99281
Panjang resi: 8

Mari kita bedah baris demi baris:

  1. daftarKota.Find(...): Method Find mengembalikan string? karena elemen yang cocok bisa saja tidak ada; state dicari awalnya mungkin-kosong.
  2. dicari!.ToUpperInvariant(): Kita menjamin daftar memuat kota berawalan Sur, sehingga akhiran ! menumpas warning CS8602 pada baris ini.
  3. if (resi != null): Di dalam blok, compiler mengangkat state resi, sehingga pencetakan pertama bebas warning.
  4. resi!.Length: Setelah blok if tanpa else, state kembali mungkin-kosong; akhiran ! menyatakan kita tahu pemanggilan AmbilResi("ORD-3001") selalu menghasilkan resi.

Warning yang Ditumpas dan Sisanya #

Tanpa akhiran !, kode di atas memunculkan warning berikut (path project dipangkas):

text
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.