Wenn wir auf eine Eigenschaft eines Objekts zugreifen, das einen Wert null
hat, werden wir eine null
Ausnahme normalerweise auftreten. Aber wir, wenn wir auf HasValue
Eigenschaft eines Nullable
object
zugreifen, wird es ein Ergebnis geben. Ich würde gerne wissen, was Umsetzung hinter dem sceen wäre.Implementierung hinter (Nullable Type) .HasValue
Antwort
Wenn Sie es nicht bereits wissen, sind Nullable-Typen wie int?
nur Nullable<int>
.
Nullable Typen in C# sind nur ein "syntaktischer Zucker". Zur Kompilierzeit ersetzt der Compiler alle int?
und double?
und bool?
durch Nullable<int>
, Nullable<double>
und Nullable<bool>
.
Beachten Sie, dass Nullable<T>
eigentlich ein struct ist! Also technisch kann es niemals null sein! Der Grund, warum Sie einem Nullwert-Typ null zuweisen können, ist ein weiterer syntaktischer Zucker. Wenn Sie einem nullfähigen Typ null zuweisen, wird die Eigenschaft HasValue
auf false gesetzt. Wenn Sie ihm einen Nicht-Null-Wert zuweisen, setzt er HasValue
wieder auf True und legt den zugrunde liegenden Wert auf den Wert fest, den Sie festlegen.
Dies ist eine kurze Beschreibung der Funktionsweise von Nullable-Typen. Nun zurück zu Ihrer Frage:
Aber wir, wenn wir HasValue Eigenschaft eines Nullable-Objekt zuzugreifen, wird es ein Ergebnis
gibt Ich denke, Sie meinen
Aber wenn wir Zugang
HashValue
Eigenschaft eines, sagenint?
, wird es nie eine Ausnahme werfen, auch wenn die Variablenull
ist! Warum?
Wie ich schon sagte, Nullable<T>
eine Struktur ist, so kann es nie null sein. Aus diesem Grund können Sie auf die Eigenschaft HasValue
zugreifen und niemals eine Ausnahme auslösen.
"Aber warum wird durch den Zugriff auf die Value
-Eigenschaft eines Nullable-Objekts manchmal eine Ausnahme ausgelöst?" du könntest fragen.
Das ist wegen der Implementierung der Nullable<T>
Struktur. Wie Sie sehen here:
public T Value {
get {
if (!hasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return value;
}
}
Es wird überprüft, wenn hasValue
wahr ist. Wenn es falsch ist, wirf eine Ausnahme aus.
Also deshalb.
Die .NET-Quelle ist [verfügbar online] (http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e). –