Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.