? (Nullable) Operator in C # [Duplizieren]

8

Was geändert wird, indem ein Nullable-Operator auf einen Werttyp-Datentyp angewendet wird, der jetzt null speichern kann.

    
Govind KamalaPrakash Malviya 06.07.2010, 05:56
quelle

5 Antworten

19

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:

%Vor%

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.

    
Jon Skeet 06.07.2010, 06:15
quelle
5

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.

    
Oded 06.07.2010 05:59
quelle
3

An dem Werttyp selbst wird nichts geändert, er wird einfach in eine System.Nullable<T> struct eingebettet. Ссылка

    
Frank Tzanabetis 06.07.2010 06:05
quelle
1

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.

    
Michael Shimmins 06.07.2010 06:01
quelle
-3

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

quelle

Tags und Links