! (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 x
eredmé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.