! Operator (null-forgiving) (C#-verwijzing)
De unaire postfix-operator !
is de operator null-forgiving of null-onderdrukking. In een ingeschakelde context voor null-aantekening gebruikt u de operator null-forgiving om alle null-waarschuwingen voor de voorgaande expressie te onderdrukken. De unaire voorvoegseloperator !
is de logische negatieoperator. De operator null-forgiving heeft geen effect tijdens runtime. Dit is alleen van invloed op de statische stroomanalyse van de compiler door de null-status van de expressie te wijzigen. Tijdens runtime wordt de expressie x!
geƫvalueerd naar het resultaat van de onderliggende expressie x
.
Zie Null-referentietypen voor meer informatie over de functie voor null-verwijzingstypen.
Voorbeelden
Een van de use cases van de operator null-forgiving is het testen van de argumentvalidatielogica. Denk bijvoorbeeld aan de volgende klasse:
#nullable enable
public class Person
{
public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
public string Name { get; }
}
Met behulp van het MSTest-testframework kunt u de volgende test maken voor de validatielogica in de constructor:
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
var person = new Person(null!);
}
Zonder de operator null-forgiving genereert de compiler de volgende waarschuwing voor de voorgaande code: Warning CS8625: Cannot convert null literal to non-nullable reference type
Met behulp van de operator null-forgiving geeft u aan dat null
de compiler wordt verwacht en waarover geen waarschuwing moet worden gegeven.
U kunt ook de operator null-forgiving gebruiken wanneer u zeker weet dat een expressie niet kan zijn null
, maar dat de compiler dat niet kan herkennen. Als de IsValid
methode in het volgende voorbeeld wordt geretourneerd true
, is het argument niet null
en kunt u deze veilig deductie uitvoeren:
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;
Zonder de operator null-forgiving genereert de compiler de volgende waarschuwing voor de p.Name
code: Warning CS8602: Dereference of a possibly null reference
Als u de IsValid
methode kunt wijzigen, kunt u het kenmerk NotNullWhen gebruiken om de compiler te informeren dat een argument van de IsValid
methode niet kan zijn null
wanneer de methode retourneert 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;
In het voorgaande voorbeeld hoeft u de operator null-forgiving niet te gebruiken, omdat de compiler voldoende informatie heeft om erachter te komen dat deze p
zich niet null
in de if
instructie bevindt. Zie Upgrade-API's met kenmerken om null-verwachtingen te definiƫren voor meer informatie over de null-status van een variabele.
C#-taalspecificatie
Zie de sectie Null-forgiving-operator van het concept van de specificatie voor null-referentietypen voor meer informatie.