Sind nullfähige Typen Referenztypen?

135

Wenn ich ein intals nullbar deklariere

int? i=null;

Wird ihier ein Referenztyp?

Vaibhav Jain
quelle

Antworten:

136

Nein, eine Nullable ist eine Struktur. Was passiert ist, dass die nullbare Struktur zwei Werte hat:

  1. Der Wert des Datentyps ( intfür int?, DateTimefür DateTime?usw.).
  2. Ein boolescher Wert, der angibt, ob der Datentypwert festgelegt wurde. ( HasValueist das Eigentum.)

Wenn Sie den Wert des Datentyps festlegen, ändert sich die Struktur HasValuein true.

Nullable-Typen (C # -Programmierhandbuch)

kemiller2002
quelle
26

Aus nullbaren Typen (C # -Programmierhandbuch) :

Nullable-Typen sind Instanzen der System.Nullable-Struktur.

und

Nullable-Typen stellen Werttypvariablen dar, denen der Wert null zugewiesen werden kann. Sie können keinen nullbaren Typ basierend auf einem Referenztyp erstellen. (Referenztypen unterstützen bereits den Nullwert.)

Nein, sie sind keine Referenztypen.

ChrisF
quelle
14

Nullable-Typen sind weder Werttypen noch Referenztypen. Sie ähneln eher Werttypen, haben jedoch einige Eigenschaften von Referenztypen.

Natürlich können nullbare Typen auf gesetzt werden null. Darüber hinaus kann ein nullfähiger Typ eine generische structEinschränkung nicht erfüllen . Wenn Sie einen nullbaren Typ mit HasValuegleich boxen false, erhalten Sie einen nullZeiger anstelle eines nullbaren Typs (eine ähnliche Situation besteht beim Unboxing).

Diese Eigenschaften machen nullfähige Typen zu nicht wertvollen Typen, aber sie sind sicher auch keine Referenztypen. Sie sind ihre eigenen speziellen Nullwerttypen.

Stephen Cleary
quelle
6

Nein, der Nullable-Typ ist tatsächlich eine Struktur. Die Laufzeit übernimmt auf intelligente Weise die Einstellung eines Nullwerts für Sie und gibt das Erscheinungsbild eines Referenztyps an, wenn dies nicht der Fall ist.

Matthew Abbott
quelle
2
Ich würde "intelligent behandeln" fragen, eher subjektiv. Persönlich finde ich das Verhalten verwirrend und oft nervig.
nicodemus13
0

Sie sollten einen Referenztyp nicht zu einem nullbaren Typ machen müssen, da Sie an seiner Stelle null übergeben können.

Devlife
quelle