Short Tip #07: C# i "?" po raz kolejny
W jednej z notek z serii „Short Tip” pisałem o użyciu operatorów ? i ??. Tym razem znak zapytania pojawi się w innym kontekście.
Pierwsze założenie (plus wyjaśnienie, tak na wszelki wypadek): zakładam, że znane są pojęcia (i rozróżnienie na) Value types i Reference types. W dużym skrócie: Value types (czy „typy wartościowe” to dobre tłumaczenie?) to wszelkiego rodzaju typy wbudowane/typy przekazywane przez wartość (int
, bool
etc.) a także enum
‚y oraz struktury. Istotną właściwością jest to, że takiej zmiennej nie można przypisać wartości null
, w przeciwieństwie do zmiennej typu referencyjnego. Tyle słowem wstępu.
Ostatnie zdanie poprzedniego akapitu okazuje się być nie do końca prawdziwe, lecz trzeba do tego zaprząc dodatkowy mechanizm. Do rzeczy:
Używając interfejsu
System.Nullable<T>
, gdzie T
jest właśnie typem przekazywanym przez wartość można danej zmiennej przypisać dodatkową wartość null
. Przykład:
System.Nullable<bool> undefinedBool = true; undefinedBool = null;
lub, skracając zapis i nawiązując nareszcie do tematu wpisu:
bool? undefinedBool = true; undefinedBool = null;
Oznaczenie zmiennej jako Nullable
daje dostęp do dwóch właściwości (obie są tylko-do-odczytu):
bool HasValue
– informuje o tym, czy danej zmiennej została przypisana wartość (HasValue == true
) lub czy jest ona niezainicjalizowana (HasValue == false
)
T Value
– właściwa wartość zmiennej (odwołanie się do niej, gdy HasValue == false
skutkuje wyjątkiem InvalidOperationException
)
O różnicach między typami przekazywanymi przez wartość a typami referencyjnymi na pewno kiedyś jeszcze napiszę, bo kilka szczegółów w ich używaniu jest godnych uwagi.
Jedna odpowiedź Zostaw komentarz