null tip podataka i operator ?? u C# 2.0


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:

image

Umjesto pisanja Nullable<T> null vrijednosni tip podataka skraćeno možemo definisati preko operatora ?. Prethodni primjer je identičan sljedećem primjeru:

image

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.

image

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.

Advertisement

Korisni savjeti i trikovi o .NET programiranju


Stranicu o kojoj danas posvjećujem ovaj post zaista to i zaslužuje. Na njoj se nalazi više korisnih savjeta kako programirati na elegantan način na .NET platformi. Posjetite je i naučite nešto usput. Naime radi se o http://dotnettipoftheday.org/ čiji slogan stranice sve govori:  .NET Tip of The Day – Learn one new .NET trick every day. Stranica je otvorenog tipa,  pa uz učenje nekog trika kojeg niste znali možete ostaviti i vi svoj neki koristan savjet kako programirati na .NET platformi.

Windows Server Release Candidate 0


Danas, u svom blogu Somasegar  objavljuje lansiranje Windows Server 2008 RC0, koji je prvi korak kad finaloj verziji ovog gigantskog Server operativnog sistema. Plan za objavljivanje finalne verzije 27. Februar 2008 godine, kada će zajedno s tim izaći i Microsoft SQL Server 2008, te Visual Studio 2008. Više informacija možete dobiti na ovim linkovima: ovdje, ovdje i ovdje.

LINQ – .NET Language Integrated Query III Dio


U nekoliko prethodnih postova pisao sam o novinama i proširenjim nove verzije C# 3.0. Proširenja koja su spomenuta omogućuju implementaciju LINQ (Language Integrated Query) kao nove tehnologije pristupa i manipulacije informacija u aplikaciji.

Takodjer ovaj tekst predstavlja nastavk serije tekstova o LINQ

GroupBy operator

Skup standardni operatora upita čini i operator grupiranja GroupBy, koji uspostavlja podjelu nad sekvencijalnim vrijednostima temeljenim na funkcijama ekstrakcije. Ovaj operator vraća skup IGrouping podataka za svaki različiti vrijednosni kriterij. Svakako da je Igrouping izvedeni interfejs od Ienumerabl koji dodatno sadrži kriterij koji je korišten za ekstrakciju podataka iz izvora.

Jednostavan primjer upotrebe GroupBy operatora možemo predstaviti na sljedećoj slici:

linq01

Poslije pokretanja ovog programa rezultat je prikazan na sljedećoj slici:

Agregacijski operatori

Agregacijski operatori koji su podržani u LINQ definišemo na sličan način. Napišimo primjer upotrebe agregacijskog operatora Agregate. Ovaj operator vrši određenu kalkulaciju na sekvencom podataka. Operator vrši operacije koristeći lambda izraze nad svakoj sekvenci podataka. Sljedeći primjer izračunava broj karaktera korištenih u cijelom nizu:

Rezultat pokretanja programa:

Agregate operator propisuje u Count operator i 4 numerička agregacijska operatora(Min, Max, Sum, i Average) minimum, maksimum, suma i srednja vrijednost respektivno. Ovi numerički operatori procesuiraju nad sekvencama podataka bilo kojeg numeričkog tipa podataka int, double, decimal i sl.

Sljedeći primjer prokazuje upotrebu nekoliko pomenutih operatora:

Rezultat pokretanja programa prikazan je na sljedečoj slici:

Cjelokupan text u 5 dijelova koji je napisan o LINQ mozete skinuti odavde.