niedziela, 20 września 2015

C# null

Czyli wszystko co chcielibyście wiedzieć o null w c# a NIE boicie się zapytać

Na wstępie trzeba napisać oczywistą oczywistość: NULL jest w C# wartością... pustą.
Null może wystąpić w typach referencyjnych jak i "wartościowymi" (Reference types / Value types). Do typów wartościowych można go przypisać na 2 sposoby:

int? i;

Nullable i;

Obie linijki robią to samo.

Dla typów referencyjnych będzie to po prostu:
Object o;
 
W kodzie bardzo często można zauważyć notoryczne sprawdzanie czy czasem jakiś obiekt nie jest nullem.
if (obj == null || i.HasValue) {
//...
}
 
inną techniką jest użycie ?? (dwa pytajniki)
Object result = obj ?? new Object()
 
znaczy: jeśli obj jest null, to podstaw pod result new Object();
Istnieje możliwość jeszcze takiego (pięknego) zapisu):
string result = value1 ?? value2 ?? value3 ?? String.Empty;
 
Nie jest to dobra praktyka tym bardziej, że jeśli gdzieś nie przewidzimy warunku wtedy dostaniemy po oczach wyjątkiem "nullreferenceexception". Dobrą obroną jest utworzenie "specjalnego przypadku" (Special case / Null object pattern). Całość sprowadza się do utworzenia podklasy, reprezentującej wartości "puste", np.:
class Osoba {
   string Imie {get;set;}
   string Nazwisko {get;set;}
}
 
tworzymy reprezentację "nullową/specjalny warunek":
class OsobaNull : Osoba {
   public OsobaNull() {
       Imie = "";
       Nazwisko = "";
   }
}
 
i tylko w jednym przypadku sprawdzamy null, tam gdzie pobieramy obiejkt typu osoba, jeśli tam wykryjemy nulla to zwracamy new OsobaNull() i nigdzie już nie potrzebujemy sprawdzać żadnych warunków. Kod się wykona ale będą tak ustawione wartości obiektu, że kod nic zlego nie zrobi i nie zakończy się błędem.

2 komentarze:

Besmted pisze...

Dzięki, swietny wpis
_____________________
https://www.aptusshop.pl/sklepy-internetowe-gdansk.php

szkolenie sql warszawa pisze...

Rewelacyjny blog programistyczny. Od jakiegoś czasu mocno studiuję SQL - chcę nawet iść na kurs, ale dzięki tobie kilka rzeczy już umiem!