Megosztás a következőn keresztül:


! (null-forgiving) operátor (C# hivatkozás)

A unary postfix ! operátor a null-elbocsátás vagy null-elnyomás operátor. Engedélyezett null értékű jegyzetkörnyezetben a null-elbocsátó operátorral letilthatja az előző kifejezés összes null értékű figyelmeztetését. A unary prefix ! operátor a logikai negation operátor. A null-elbocsátó operátornak futásidőben nincs hatása. Ez csak a fordító statikus folyamatelemzését befolyásolja a kifejezés null állapotának módosításával. Futtatáskor a kifejezés x! a mögöttes kifejezés xeredményének lesz kiértékelve.

A null értékű referenciatípusok funkcióval kapcsolatos további információkért lásd : Null értékű referenciatípusok.

Példák

A null-megbocsátó operátor egyik használati esete az argumentumérvényesítési logika tesztelése. Vegyük például a következő osztályt:

#nullable enable
public class Person
{
    public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));

    public string Name { get; }
}

Az MSTest tesztelési keretrendszer használatával a konstruktorban az alábbi tesztet hozhatja létre az érvényesítési logikához:

[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
    var person = new Person(null!);
}

A null-elbocsátó operátor nélkül a fordító a következő figyelmeztetést generálja az előző kódhoz: Warning CS8625: Cannot convert null literal to non-nullable reference type. A null-megbocsátó operátor használatával tájékoztatja a fordítót arról, hogy az átadás null várható, és nem szabad figyelmeztetni.

Akkor is használhatja a null-megbocsátó operátort, ha biztosan tudja, hogy egy kifejezés nem lehet null , de ezt a fordító nem tudja felismerni. A következő példában, ha a metódus visszaadjatrue, IsValid az argumentuma nemnull, és nyugodtan elhalaszthatja:

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;

A null-megbocsátó operátor nélkül a fordító a következő figyelmeztetést generálja a p.Name kódhoz: Warning CS8602: Dereference of a possibly null reference.

Ha módosíthatja a IsValid metódust, a NotNullWhen attribútummal tájékoztathatja a fordítót arról, hogy a IsValid metódus argumentuma nem lehet null , amikor a metódus visszatér 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;

Az előző példában nem kell null-megbocsátó operátort használnia, mert a fordító elegendő információval rendelkezik ahhoz, hogy megtudja, hogy p nem lehet null az if utasításban. Azokról az attribútumokról, amelyek lehetővé teszik a változó null állapotával kapcsolatos további információk megadását, tekintse meg az API-k frissítése attribútumokkal a null elvárások meghatározásához.

C# nyelvspecifikáció

További információ: A null-megbocsátó operátor szakasz a null értékű referenciatípusok specifikációjának vázlatában.

Lásd még