Cluj München 1140km

Gânduri clujene din Bavaria

München - Munich - Monaco di Baviera

29. iunie 2008 11:59
by skorpionking
0 Comentarii

.NET: Nullable Types in C# si null coalescing operator

29. iunie 2008 11:59 by skorpionking | 0 Comentarii

Una dintre noutatile C# 2.0, poate putin cunoscuta si prea putin folosita, este notiunea de nullable types (hei, cine imi spune si mie: exista o denumire in romana pentru asa ceva?). Aceste tipuri nullable adreseaza scenariile in care dorim sa avem un tip primitive (value type) care sa contina o valoare null (respective o valoare pentru ceva necunoscut). Acest scenariu se intalneste mai ales cand avem de-a face cu baze de date, dar e folositor si in alte scenarii, mai ales cand vine vorba tipuri generice (generics) si de operatorul ?? (null coalescing operator). Acest nullable type se putea simula si in versiunile anterioare, dar implica boxing values sau un wrapper pentru value typeul cu care aveai de a face.

Nullable types pot fi definite in mai multe feluri:

//Call a DB routine that may return a C# null value (not DBNull.Value) 
Nullable<
int> age GetAge();

Sau

//Call a DB routine that may return a C# null value (not DBNull.Value)
int
? age GetAge();

In loc sa scrii

if (age.HasValue) …

Poti compara direct cu null

if (age == null) …

Unul dintre operatorii simpli dar subtili este ?? null coalescing operator, care ofera posibilitatea de a testa contra lui null si in caz afirmativ de a returna o valoare alternativa.

int? age = GetAge();
int
? tempAge age??-1;


Partea interesanta e ca se pot efectua operatii pe nullable types si aceste operatii propaga mai departe aceste nullable types:


Nullable<int> x = new Nullable<int>( 12 );

int? y = null;
int? z = 14;

int? i = x + y;   // i == null

int? j = x + z;   // j == 26

Operatorul  ??  castiga importanta in LINQ, cand de exemplu avem o interogare si la un moment primim valori nedeterminate ca in urmatorul exemplu (yearsatcompany nu e specificat si dorim sa avem o valoare):

<employees>

  <employee>

    <name>Popescu George</name>

    <email>gpopescu@firma-de-succes.ro</email>

    <yearsatcompany>5</yearsatcompany>

  </employee>

  <employee>

    <name>Ionescu Vasile</name>

    <email>vionescu@firma-de-succes.ro</email>

    <yearsatcompany></yearsatcompany>

  </employee>

</employees>

XDocument employeeFile = new XDocument(Server.MapPath("Employees.xml"));

var employees = from e in employeeFile.Descendants("employee")

                select new

                {

                 name = (string)e.Element("name"),

                 email = (string)e.Element("email"),

                 yearsatcompany = (int?)e.Element("yearsatcompany") ?? 0

                };

Life is good and happy coding :-)

 

Adaugă comentariu

biuquote
Loading