Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


! Operator null-forgiving (odwołanie do C#)

Operator jednoargumentowego postfiksu ! to operator typu null-forgiving lub null-suppression. W włączonym kontekście adnotacji dopuszczającej wartość null należy użyć operatora forgiving o wartości null, aby pominąć wszystkie ostrzeżenia dopuszczające wartość null dla poprzedniego wyrażenia. Operator prefiksu ! jednoargumentowego jest operatorem negacji logicznej. Operator umożliwiający ignorowanie wartości null nie ma wpływu podczas wykonywania. Ma to wpływ tylko na statyczną analizę przepływu kompilatora przez zmianę stanu null wyrażenia. W czasie wykonywania wyrażenie x! oblicza wynik wyrażenia bazowego x.

Aby uzyskać więcej informacji na temat funkcji typów referencyjnych dopuszczających wartości null, zobacz Typy referencyjne dopuszczające wartości null.

Przykłady

Jednym z przypadków użycia operatora ignorującego wartość null jest testowanie logiki walidacji argumentów. Rozważmy na przykład następującą klasę:

#nullable enable
public class Person
{
    public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));

    public string Name { get; }
}

Korzystając z platformy testowej MSTest, możesz utworzyć następujący test dla logiki walidacji w konstruktorze:

[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
    var person = new Person(null!);
}

Bez operatora ignorującego null kompilator generuje następujące ostrzeżenie dla poprzedniego kodu: Warning CS8625: Cannot convert null literal to non-nullable reference type. Korzystając z operatora forgiving o wartości null, należy poinformować kompilator, że przekazywanie null jest oczekiwane i nie powinno być ostrzegane.

Możesz również użyć operatora ignorującego null, gdy na pewno wiesz, że wyrażenie nie może być null, ale kompilator nie potrafi tego rozpoznać. Jeśli w poniższym przykładzie metoda IsValid zwraca true, jej argument nie jest null i można bezpiecznie go wyłuszczyć:

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;

Bez operatora wybaczającego wartość null kompilator generuje następujące ostrzeżenie dla kodu p.Name: Warning CS8602: Dereference of a possibly null reference.

Jeśli możesz zmodyfikować metodę IsValid , możesz użyć atrybutu NotNullWhen , aby poinformować kompilator, że argument IsValid metody nie może być null , gdy metoda zwraca polecenie 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;

W poprzednim przykładzie nie trzeba używać operatora pomijania wartości null, ponieważ kompilator ma wystarczająco dużo informacji, aby ustalić, że p nie może być null wewnątrz instrukcji if. Aby uzyskać więcej informacji na temat atrybutów, które umożliwiają podanie dodatkowych informacji o stanie null zmiennej, zobacz Uaktualnianie interfejsów API z atrybutami w celu zdefiniowania oczekiwań null.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję operatora dopuszczającego wartość null w wersji roboczej specyfikacji typów referencyjnych dopuszczających wartość null.

Zobacz też