2011-06-17 19 views

Odpowiedz

16

int nie może być null. Jest to alias dla struktury Nullable<int>.

+7

Zauważ, że 'int?' Jest * również * typ wartości ... co jest sprzeczne z "z definicji" twojego pierwszego zdania ... –

+0

Nadal nie zgadzam się z twoim pierwszym zdaniem, ponieważ 'int?' Jest typem wartości z wartością pustą. Następnie mówimy o "obiekcie" będącym wartością null - podczas gdy obiekt * nigdy nie jest pusty, tylko odwołanie jest ... a wartość typu wartości i tak nie jest obiektem. –

+0

Nie możesz ustawić int? do wartości null, ale możesz przypisać do niej wartość zerową :) –

4

to składniowym kompilator cukru dla Nullable<int>

Zasadniczo twój numer (lub jakikolwiek inny rodzaj wartości) może być pusty, jak również jego wartość. Sprawdzasz wartość za pomocą właściwości HasValue. Mogą być wrzucane do ich typów wartości (chociaż to się nie powiedzie, jeśli są puste) lub możesz użyć właściwości Value (ponownie wygeneruje wyjątek, jeśli jest zerowy)

Jedna rzecz, która zazwyczaj wydaje się być przeoczona w przypadku używania typów zerowalnych jest to metoda GetValueOrDefault(), która zwraca wartość domyślną (T), jeśli obiekt ma wartość null.

Jak @Kyle Trauberman zauważa w komentarzu można rzeczywiście porównać go na null zamiast sprawdzania hasValue. Sam typ jest typem wartości z overriden równości metod tak bardzo, jak nigdy nie będzie null się to zwróci true w porównaniu do wartości null, jeśli nie ma wartości.

+0

Można również użyć zwykłego 'wartość == null' sprawdzić zamiast' HasValue'. –

3

questionmark za zgłoszenia oznacza, że ​​zmienna jest pustych.

5

int? jest skrótem dla Nullable<int>, który pozwala udawać, że liczba całkowita może obsługiwać wartości null.

int? foo = null; 

Jest to przydatne dla wskazuje na brak wartości, gdzie byś wcześniej nie użył magicznego wartość (-1) w przeszłości, a także przydatne, gdy do czynienia z kolumnami bazy danych, które pozwalają pustych wpisów.

Na wygląd quasi pogłębionej, A Nullable<T> (wprowadzone w NET 2.0) jest po prostu owijka typu wartości T który udostępnia dwie właściwości HasValue i Value gdzie HasValue jest logiczną, która wskazuje, czy wartością został ustawiony i Value (oczywiście wystarczająco) zwraca wartość. Błędem jest uzyskanie dostępu do Value, jeśli HasValue ma wartość false. Dlatego też, aby uzyskać dostęp do Value, należy najpierw sprawdzić kod HasValue. Dodatkowo, jeśli chcesz po prostu znormalizować wartości inne niż domyślne (0 dla typów liczbowych), możesz użyć metody GetValueOrDefault() bez sprawdzania HasValue.

Należy zauważyć, że chociaż wydaje się, aby ustawić foo do null, to nie faktycznie zerowy w normalnych scenariuszy użytkowania. null to po prostu dodatkowy cukier syntaktyczny dla tego typu.Powyższa linia kodu przekłada się

Nullable<int> foo = new Nullable<int>(); 

Inicjowanie zmiennych w ten sposób po prostu ustawia właściwość HasValue false.

Jednak w sytuacjach związanych z boksowaniem wartość będzie w rzeczywistości ustawiona na wartość null, jeśli HasValue ma wartość fałsz (w innym przypadku będzie to T). Bądź świadom konsekwencji! Na przykład: w:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty 
Type type = foo.GetType(); // blows up! GetType causes the value to box 
          // resulting in a NullReferenceException 

To szybki kurs zderzeniowy. Aby uzyskać więcej informacji, odwiedź stronę documentation.

10

int? jest skrótem dla utworzenia wystąpienia ogólnym System.Nullable<T> typu konstrukcji. Pozwala ci to uczynić zmienną nullable. Pamiętaj, że biorąc pod uwagę, że składnia <ValueType>? jest skrótem, można zadeklarować zmienne tak:

Nullable<int> i = 10;