Der Schlüssel zum Verständnis der null!
Mittel ist das Verständnis des !
Bedieners. Möglicherweise haben Sie es zuvor als "nicht" -Operator verwendet. Seit C # 8.0 kann der Operator jedoch auch für einen Typ zur Steuerung der Nullabilty verwendet werden
Was ist der !
Operator, wenn er für einen Typ verwendet wird?
Der !
Betreiber, wenn sie auf einer Art verwendet wird , wird die genannte Null Versöhnlich Operator [ docs ]. Es wurde in C # 8.0 eingeführt
Technische Erklärung
Typische Verwendung
Unter der Annahme dieser Definition:
class Person
{
public string? MiddleName;
}
Die Verwendung wäre:
void LogPerson(Person person)
{
Console.WriteLine(person.MiddleName.Length);
Console.WriteLine(person.MiddleName!.Length);
}
Dieser Operator deaktiviert grundsätzlich die Compiler-Nullprüfungen.
Innenleben
Die Verwendung dieses Operators teilt dem Compiler mit, dass auf etwas zugegriffen werden kann, das null sein kann. Sie drücken die Absicht aus, sich in diesem Fall nicht um die Nullsicherheit zu kümmern.
Es gibt zwei Zustände, in denen sich eine Variable befinden kann - wenn es um Nullsicherheit geht.
- Nullable - Kann null sein.
- Nicht nullbar - Kann nicht null sein.
Seit C # 8.0 sind alle Referenztypen standardmäßig nicht nullwertfähig.
Die "Nullbarkeit" kann durch diese 2 neuen Typoperatoren geändert werden:
!
= Von Nullable
bisNon-Nullable
?
= Von Non-Nullable
bisNullable
Diese Operatoren sind im Grunde genommen Gegenstücke zueinander. Der Compiler verwendet die Informationen, die Sie mit diesen Operatoren definieren, um die Nullsicherheit zu gewährleisten.
?
Bedienergebrauch.
Nullable string? x;
x
ist ein Referenztyp - Standardmäßig also nicht nullwertfähig.
- Wir wenden den
?
Operator an - was ihn nullbar macht.
x = null
Funktioniert gut.
Nicht nullbar string y;
y
ist ein Referenztyp - Standardmäßig also nicht nullwertfähig.
y = null
Erzeugt eine Warnung, da Sie etwas, das nicht null sein soll, einen Nullwert zuweisen.
!
Bedienergebrauch.
string x;
string? y = null;
x = y
- Illegal! - -
Warning: "y" may be null
- Die linke Seite der Zuweisung ist nicht nullbar, die rechte Seite ist nullbar.
x = y!
- Legal!
- Die rechte und linke Seite der Zuweisung ist nicht nullwertfähig.
- Funktioniert seit
y!
Wendet den !
Operator an y
, für den er nicht nullwertfähig ist.
WARNUNG Der !
Operator deaktiviert die Compilerprüfungen nur auf Typsystemebene. - Zur Laufzeit kann der Wert immer noch null sein.
Dies ist ein Anti-Muster.
Sie sollten versuchen , die Verwendung des !
Null-Forgiving-Operators zu vermeiden .
Es gibt gültige Anwendungsfälle (nachstehend ausführlich beschrieben) wie Unit-Tests, bei denen dieser Operator für die Verwendung geeignet ist. In 99% der Fälle sind Sie mit einer alternativen Lösung besser dran. Bitte schlagen Sie nicht Dutzende von !
in Ihren Code, nur um die Warnungen zum Schweigen zu bringen. Überlegen Sie, ob Ihre Sache die Verwendung wirklich rechtfertigt.
Verwenden Sie - aber mit Vorsicht. Wenn es keinen konkreten Zweck / Anwendungsfall gibt, ziehen Sie es vor, ihn nicht zu verwenden.
Es negiert die Auswirkungen der Null-Sicherheit, die der Compiler garantiert.
Die Verwendung des !
Operators führt zu sehr schwer zu findenden Fehlern. Wenn Sie eine Eigenschaft haben, die als nicht nullbar markiert ist, gehen Sie davon aus, dass Sie sie sicher verwenden können. Aber zur Laufzeit stößt man plötzlich auf einen NullReferenceException
und kratzt sich am Kopf. Da ein Wert nach Umgehen der Compiler-Checks mit tatsächlich null wurde !
.
Warum existiert dieser Operator dann?
- In einigen Randfällen kann der Compiler nicht erkennen, dass ein nullbarer Wert tatsächlich nicht nullwertfähig ist.
- Einfachere Migration älterer Code-Basen.
- In einigen Fällen ist es Ihnen einfach egal, ob etwas null wird.
- Wenn Sie mit Unit-Tests arbeiten, möchten Sie möglicherweise das Verhalten von Code überprüfen, wenn a
null
durchkommt.
Beantworten Sie Ihre Frage gezielt.
Was bedeutet null!
das?
Es teilt dem Compiler mit, dass dies null
kein null
Wert ist. Klingt komisch, nicht wahr?
Es ist das gleiche wie y!
im obigen Beispiel. Es sieht nur seltsam aus, da Sie den Operator auf das null
Literal anwenden . Das Konzept ist jedoch dasselbe.
Herausgreifen, was passiert.
public string LastName { get; } = null!;
Diese Zeile definiert eine nicht nullfähige Klasseneigenschaft mit dem Namen LastName
type string
. Da es nicht nullbar ist, können Sie es technisch nicht null zuweisen - offensichtlich.
Aber Sie tun genau das - assign null
zu LastName
- durch die Verwendung von !
Operator. Weil null!
nicht null ist - soweit es den Compiler um Nullsicherheit geht.
!
ist der nullverzeihende Operator , der dem Compiler sagt, dass er, obwohl er es normalerweise nicht zulässt, wegschauen und es trotzdem zulassen sollte, weil wir es besser wissen.null!
selbst hat wenig praktischen Nutzen, da es die Nützlichkeit nullbarer Referenztypen so gut wie negiert. Es ist nützlicher, wenn Sie wissen, dass ein Ausdruck nicht seinnull
kann, der Compiler jedoch nicht.