! 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.
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.
Aby uzyskać więcej informacji, zobacz sekcję operatora dopuszczającego wartość null w wersji roboczej specyfikacji typów referencyjnych dopuszczających wartość null.
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię: