.NET 2.0: Nulové základné dátové typy

Niekedy je výhodné mať v základnom dátovom type ako int, float, double, DateTime a pod. uloženú hodnotu null. Všetko sú to hodnotové typy, čiže musia byť vždy inicializované na určitú hodnotu.

Problém nastáva pri práci s databázami, ktoré pri týchto dátových typoch umožňujú použitie hodnoty NULL, v .NETe reprezentovanej ako trieda DBNull.

Často sa teda do týchto štruktúr ukladali hodnoty, ktoré boli mimo rozsahu definovaného architektúrov programu (napr. máme tabuľku produktov, v ktorej sú produkty bez uvedenej ceny. Stĺpec je dátového typu money alebo decimal a umožňuje mať aj nulové hodnoty. Pri načítaní dát z DB treba kontrolovať, či hodnota nie je typu DBNull a ak je, vložiť do premennej hodnotu -1M, pretože zápornú cenu produkt nemôže mať.)

.NET 2.0 obsahuje novú triedu System.Nullable, ktorá umožňuje uchovať v hodnotových typoch aj hodnotu null. Je teda lepšie rozpoznateľné, či je hodnota nezadaná, alebo zadaná hodnota je z povoleného rozsahu, alebo nie. Jazyk C# obsahuje nový operátor ?? pre prácu s triedou Nullable<T> a umožňuje skrátený zápis pre nulový hodnotový typ.

Nulový hodnotový typ sa definuje napísaním ? za názov hodnotvého typu.

int? x;

Tento zápis je ekvivalentný zápisu

Nullable<int> x;

Na zistenie, či premenná obsahuje nejakú hodnotu, je možné použiť vlastnosť Nullable<T>.Has­Value alebo pri priraďovaní operátor ??.

Do hodnotového typu je operátorom ?? vložená hodnota nulového hodnotového typu ak je v ňom priradená nejaká hodnota. Ak je hodnota nulová, do hodnotového typu sa vloží hodnota na pravej strane operandu ??.

Taktiež je možné zavolať metódu Nullable<T>.Get­ValueOrDefault().

int? x = null;

// prvá možnosť – určenie vlastnej hodnoty v prípade „null“
int j = x ?? 0;
// druhá možnosť
int k = x.GetValueOrDe­fault(); // k = 0
// tretia možnosť
int j = 0;
int? x = null;
if (x.HasValue)
j = x.Value;

Poznámka: DBNull trieda existuje v pamäti vždy len jedna a to jej inštancia DBNull.Value. DBNull sa nikdy nerovná žiadnemu inému dátovému typu.

PS: Dnes to bolo bohužiaľ bez praktickej ukážky.