Powiel możliwe:
What's the difference between 'int?' and 'int' in C#?Wyjaśnienie int? vs int
Natknąłem jakiegoś kodu w C#, który deklaruje zmienną jako: int? number
Czego ?
oznacza i jak robi to właśnie różnią się od: int
Powiel możliwe:
What's the difference between 'int?' and 'int' in C#?Wyjaśnienie int? vs int
Natknąłem jakiegoś kodu w C#, który deklaruje zmienną jako: int? number
Czego ?
oznacza i jak robi to właśnie różnią się od: int
int
nie może być null
. Jest to alias dla struktury Nullable<int>
.
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.
Można również użyć zwykłego 'wartość == null' sprawdzić zamiast' HasValue'. –
questionmark za zgłoszenia oznacza, że zmienna jest pustych.
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.
int? może być wartością null, gdzie int nie może.
odniesienia dopuszczające wartość null Typy: http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=VS.100).aspx
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;
Zauważ, że 'int?' Jest * również * typ wartości ... co jest sprzeczne z "z definicji" twojego pierwszego zdania ... –
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. –
Nie możesz ustawić int? do wartości null, ale możesz przypisać do niej wartość zerową :) –