Was geändert wird, indem ein Nullable-Operator auf einen Werttyp-Datentyp angewendet wird, der jetzt null speichern kann.
Wie andere gesagt haben, "?" ist nur eine Kurzform, um es in Nullable<T>
zu ändern. Dies ist nur ein weiterer Werttyp mit einem booleschen Flag, der angibt, ob es sich tatsächlich um einen nützlichen Wert handelt oder ob es sich um den Nullwert für den Typ handelt. Mit anderen Worten, Nullable<T>
sieht ungefähr so aus:
Offensichtlich gibt es im echten Code mehr Methoden (wie GetValueOrDefault()
) und Konvertierungsoperatoren usw. Der C # -Compiler fügt aufgehobene Operatoren hinzu, die den ursprünglichen Operatoren für T
effektiv einen Proxy zuweisen.
Auf die Gefahr hin, wie ein kaputter Datensatz zu klingen, ist dies immer noch ein Werttyp. Es beinhaltet nicht Boxen ... und wenn Sie schreiben:
%Vor% das ist keine null Referenz - es ist der Nullwert von Nullable<int>
, d. h. derjenige, in dem hasValue
false
ist.
Wenn ein NULL-fähiger Typ eingerahmt ist, verfügt die CLR über eine Funktion, mit der der Wert entweder in eine Nullreferenz oder eine einfache Box in T eingerahmt wird. Wenn Sie also folgenden Code haben:
%Vor% Die Boxed-Werte, auf die von o1
und o2
verwiesen wird, sind nicht unterscheidbar. Sie können nicht sagen, dass das Ergebnis eines NULL-fähigen Typs ist.
Die Syntax ?
ist syntaktischer Zucker für die Nullable<T>
-Struktur.
Im Wesentlichen, wenn Sie int? myNullableInt
schreiben, ändert der Compiler es in Nullable<int> myNullableInt
.
Von MSDN (scrollen Sie nach unten zu "Nullable Types Overview"):
Die Syntax T? ist eine Kurzform für Nullable, wobei T ein Werttyp ist. Die zwei Formen sind austauschbar.
An dem Werttyp selbst wird nichts geändert, er wird einfach in eine System.Nullable<T>
struct eingebettet.
Ссылка
Der Typ ändert sich von dem, was er war, zu einem NULL-Typ.
Wenn du ein int hättest, und beschlossen, es zu einem int zu machen?:
%Vor%Und du machst es:
%Vor%ist es jetzt:
%Vor%In der Realität.
Grundsätzlich ist ein Nullable-Typ eine Boxed-Version des normalen Typs, die ein extra boolesches Feld namens hasValue enthält. Wenn dieses Feld auf "false" gesetzt ist, ist die Instanz null.
Sehen Sie sich diese Antwort an, um ein bisschen mehr über die CLR-Implementierung zu erfahren und warum sie sie vielleicht gewählt haben: Coxy 06.07.2010 06:00