Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Operator unary postfix !
adalah operator pemaafan-null, atau penekanan-null. Dalam konteks anotasi nullable yang diaktifkan, Anda menggunakan operator yang mengesampingkan null untuk mengabaikan semua peringatan nullable terhadap ekspresi sebelumnya. Operator !
awalan unary adalah operator negasi logis. Operator null-forgiving tidak berpengaruh saat runtime. Ini hanya memengaruhi analisis aliran statis kompilator dengan mengubah status ekspresi null. Pada saat runtime, ekspresi x!
dievaluasi menjadi hasil dari ekspresi x
yang mendasarinya.
Untuk informasi selengkapnya tentang fitur jenis referensi yang dapat diubah ke null, lihat Jenis referensi yang dapat diubah ke null.
Contoh
Salah satu kasus penggunaan operator null-forgiving adalah dalam menguji logika validasi argumen. Sebagai contoh, perhatikan kelas berikut:
#nullable enable
public class Person
{
public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
public string Name { get; }
}
Dengan menggunakan kerangka kerja pengujian MSTest, Anda dapat membuat pengujian berikut untuk logika validasi di konstruktor:
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
var person = new Person(null!);
}
Tanpa operator null-forgiving, kompilator menghasilkan peringatan berikut untuk kode sebelumnya: Warning CS8625: Cannot convert null literal to non-nullable reference type
. Dengan menggunakan operator null-forgiving, Anda memberi tahu kompilator bahwa melewati null
diharapkan dan tidak boleh diperingatkan.
Anda juga dapat menggunakan operator pengampunan null ketika Anda pasti tahu bahwa ekspresi tidak bisa null
tetapi pengkompilasi tidak berhasil mengenalinya. Dalam contoh berikut, jika IsValid
metode mengembalikan true
, argumennya tidak null
dan Anda dapat dengan aman mendereferensikannya:
public static void Main()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p!.Name}");
}
}
public static bool IsValid(Person? person)
=> person is not null && person.Name is not null;
Tanpa operator null-forgiving, kompilator menghasilkan peringatan berikut untuk kode p.Name
: Warning CS8602: Dereference of a possibly null reference
.
Jika Anda dapat memodifikasi IsValid
metode , Anda dapat menggunakan atribut NotNullWhen untuk memberi tahu pengkompilasi bahwa argumen IsValid
metode tidak boleh null
ketika metode mengembalikan true
:
public static void Main()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p.Name}");
}
}
public static bool IsValid([NotNullWhen(true)] Person? person)
=> person is not null && person.Name is not null;
Dalam contoh sebelumnya, Anda tidak perlu menggunakan operator pengampun null karena kompilator memiliki informasi yang cukup untuk mengetahui bahwa p
tidak dapat berada di null
dalam if
pernyataan. Untuk informasi selengkapnya tentang atribut yang memungkinkan Anda memberikan informasi tambahan tentang status null variabel, lihat Tingkatkan API dengan atribut untuk menentukan ekspektasi null.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian Operator pengampunan null dari draf spesifikasi jenis referensi yang dapat bernilai null.