! 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.

Zie ook