Bagikan melalui


! operator (null-forgiving) (referensi C#)

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.

Lihat juga