Czy typy odwołań do typów dopuszczających wartość null?

135

Kiedy oświadczam, że intjest nieważny

int? i=null;

Czy itutaj staje się typem referencyjnym?

Vaibhav Jain
źródło

Odpowiedzi:

136

Nie, wartość null jest strukturą. To, co się dzieje, to fakt, że struktura dopuszczająca wartość null ma dwie wartości:

  1. Wartość typu danych ( intfor int?, DateTimefor DateTime?itp.).
  2. Wartość logiczna, która mówi, czy wartość typu danych została ustawiona. ( HasValuejest własnością.)

Po ustawieniu wartości typu danych struktura zmienia się HasValuena true.

Typy dopuszczające wartość null (przewodnik programowania w języku C #)

kemiller2002
źródło
26

From Nullable Types (C # Programming Guide) :

Typy dopuszczające wartość null są wystąpieniami struktury System.Nullable.

i

Typy dopuszczające wartość null reprezentują zmienne typu wartości, którym można przypisać wartość null. Nie można utworzyć typu dopuszczającego wartość null na podstawie typu odwołania. (Typy odwołań obsługują już wartość null).

Więc nie, to nie są typy referencyjne.

ChrisF
źródło
14

Typy dopuszczające wartość null nie są typami wartości ani typami odwołań. Są bardziej podobne do typów wartości, ale mają kilka właściwości typów referencyjnych.

Oczywiście typy dopuszczające wartość null mogą być ustawione na null. Ponadto typ dopuszczający wartość null nie może spełnić structograniczenia ogólnego . Ponadto, gdy zapakujesz typ dopuszczający wartość null z HasValuerówną false, otrzymasz nullwskaźnik zamiast opakowanego typu dopuszczającego wartość null (podobna sytuacja występuje w przypadku rozpakowywania).

Te właściwości sprawiają, że typy dopuszczające wartość null nie są typami wartościowymi, ale z pewnością nie są też typami odwołań. Są one własnym, specjalnym typem wartości null.

Stephen Cleary
źródło
6

Nie, typ Nullable jest w rzeczywistości strukturą. Środowisko wykonawcze w inteligentny sposób obsłuży ustawienie wartości zerowej za Ciebie, nadając wygląd typu referencyjnego, gdy tak nie jest ...

Matthew Abbott
źródło
2
Zapytałbym „inteligentnie obsłużyć”, raczej subiektywne. Osobiście uważam to zachowanie za mylące i często denerwujące.
nicodemus13
0

Nie powinno być konieczne tworzenie typu referencyjnego dopuszczającego wartość null, ponieważ w jego miejsce można przekazać wartość null.

devlife
źródło