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