Uvod
Pored mnogih novina koje su se dogodile u C# 2.0 u odnosu na prethodne, svakako je i null tip. Prethodne verzije C# oskudjevale su u jednostavnim rješenjima prilikom manipulisanja s null vrijednostima. To se prvenstveno odnosi na podatke koji su dolazili iz eksternog izvora podataka kao što su baze podataka ili XML. Compajler C# 2.0 uvodi nas u novi tip podataka s kojim na vrlo jednostavan način manipulišemo null vrijednostima. Kada su u pitanju reference kao tipovi podataka tu je stvar jasna jer ovi tipovi mogu imati null vrijednost.
Kada govorimo o vrijednosnim tipovima podataka null vrijednost nije po defaultu definisana. Kada npr. mapiramo kolonu iz baze podataka koja je tipa int ili bool, u našim aplikacijama moramo dodatno implementirati manipulaciju sa null vrijednosti, jer će u suprotnom naša aplikacija izbaciti izuzetak i prekinuti rad. Npr. pogledajmo sljedeći primjer:
int i=null;
Kada želimo ovaj kod da kompajliramo dobijamo grešku koja govori o tome da vrijednosni tipovi ne mogu imati vrijednost null.Verzija kompajlera C# 2.0 ovaj problem je riješila na taj način da za svaki vrijednosni tip podataka možemo formirati null vrijednost preko generičke strukture System.Nullable<T>. Ova generička struktura na jednostavan način manipuliše sa null vrijednosnim.
Definisanje vrijednosnog tipa podatka pomoću strukture System.Nullable<T>
Definisanje vrijednosnih tipova pomoću strukture System.Nullable<T> obezbjeđujemo da tip može poprimiti vrijednost null. Npr. Sljedeći primjer pokazuje definiciju int, bool, DateTime vrijednosnih tipova pomoću pomenute strukture respektivno:
Umjesto pisanja Nullable<T> null vrijednosni tip podataka skraćeno možemo definisati preko operatora ?. Prethodni primjer je identičan sljedećem primjeru:
Korištenje null vrijenosnog tipa
Struktura Nullable<T> posjeduje nekoliko pomoćnih metoda i osobina za manipulaciju sa null vrijednosti.
HasValue osobina vraća false ako varijabla posleduje null vrijednost, inače vraća true. Provjera null vrijednosti možemo implementirati i klasičnim != operatorom tj: intVrijednost !=null.
?? Operator
Operator ?? je novina u C# 2.0 i jednostavno omogućava da se u vrijeme definisanja nullable varijable provjeri da li varijabla poprima null vrijednost, te u potvrdnom slučaju daje nam mogućnost pridruživanja diefoltne vrijednosti. Npr. Pretpostavimo da metoda GetIntFromDataBase() izvlači vrijednost iz baze podataka. Ne možemo pretpostaviti da li će metoda uvijek vraćati integer, pa u klasičnom postupku tu bi ubacili jedan if kojim bi čekirali da li je vraćena vrijednost null i pohranili neku defoltnu vrijednost. Međutim operator ?? daje nam vrlo elegantno rješenje. Npr.
Ovo znači, ako je vraćena vrijednost iz baze podataka null vrijednost tada u varijablu vrijednost pohrani vrijednost 1.
Ovaj operator je identičan operatoru ? : u C++, s kojim zamjenjujemo naredbe if else.
Zaključak
Nullable<T> struktura daje nam mogućnosti elegantnog upravljanja s null vrijednostima posebno kada manipulišemo s eksternim izvorima podataka. Ovaj tip podataka zajedno sa operatorom ?? daje nam vrlo interesantna rješenja, a posebno elegantna rješanje dobijamo u kombinaciji sa LINQ i novim tehnologija koje dolaze sa C# 3.0, o kojima će biti riječi u skoroj budućnosti na ovom blogu.