2016-05-12 22 views
-1

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 Nullableobject zugreifen, wird es ein Ergebnis geben. Ich würde gerne wissen, was Umsetzung hinter dem sceen wäre.Implementierung hinter (Nullable Type) .HasValue

+5

Die .NET-Quelle ist [verfügbar online] (http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e). –

Antwort

0

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, sagen int?, wird es nie eine Ausnahme werfen, auch wenn die Variable null 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.