! Operator (null-forgiving) (odwołanie w 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 forgiving o wartości null nie ma wpływu w czasie 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 odwołań dopuszczanych do wartości null, zobacz Typy referencyjne dopuszczane do wartości null.
Przykłady
Jednym z przypadków użycia operatora forgiving o wartości null jest testowanie logiki weryfikacji argumentu. 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 forgiving o wartości 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 forgiving o wartości 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 IsValid
metoda zwraca true
wartość , jej argument nie null
jest 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 forgiving o wartości null kompilator generuje następujące ostrzeżenie dla p.Name
kodu: 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 forgiving o wartości null, ponieważ kompilator ma wystarczającą ilość informacji, aby dowiedzieć się, że p
nie może znajdować null
się 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 forgiving o wartości null w wersji roboczej specyfikacji typów referencyjnych dopuszczających wartość null.