NullReferenceException – jak sobie radzić z nullem?

Null niejednokrotnie stanął na drodze każdemu z nas, tego jegomościa przedstawiać nie potrzeba. Sposoby radzenia sobie z nim będą treścią tego wpisu – zapraszam.

Null-coalescing operator

Operator sprawdzenia null przyjmuje postać ?? w praktyce oznacza to tyle:

Jeśli argument nie ma wartości null, to będę go używać, w przeciwnym razie użyję wartości domyślnej.

Na przykład:

string example1 = null;
string example2 = example1 ?? "test"; //wartość example2 będzie równa "test"

Jeśli wyrażenie po lewej stronie ma wartość inną niż null, to wyrażenie po prawej stronie w ogóle nie jest brane pod uwagę.

Null-conditional operator

Operator warunkowy null potocznie znany znakiem Elvisa (ze względu na podobieństwo do jego bujnej grzywy) przyjmuje postać ?.

Dzięki niemu możemy wywoływać metody i używać ich składowych tak jak robiliśmy to za pomocą zwykłego operatora  .  jednak jeśli argument po lewej stronie przyjmuje wartość null to całe wyrażenie przyjmie null – unikniemy tym samym rzucenia nam w twarz wyjątkiem NullReferenceException.

Na przykład:

var example1 = null;
string example2 = example1?.ToString(); //nie otrzymamy wyjątku, example2 będzie równe null

Gdy operator Elvisa ?. napotka wartość null, nie będzie dalej obliczać wyrażenia. W tym przypadku nie wywołamy metody ToString() na null’u która skończyła by się wyjątkiem.

int vs. null

Nie wszystkie typy zmiennych mogą przyjmować null, czego najlepszym przykłądem jest zmienna typu int

string example = null;
int exampleLength = example?.Length; // błąd - int nie może przyjąć null

Aby prawidłowo obsłużyć powyższą linię kodu należy dopuścić użycie wartości null na typie int za pomocą operatora ? tak jak przedstawiono poniżej:

int? exampleLength = example?.Length; //brak błędu - int? może przyjąć null

Jak widać z powyższych prostych przykładów z nullem należy mieć się na baczności. Niepozorne wyrażenia (?? oraz ?.)  mogą nam niejednokrotnie uratować tyłek. Nie zapominajmy o nich w ferworze kodowania, bo prędzej czy później coś nie zadziała tak jakbyśmy sobie tego życzyli. Okażę się jak zwykle, że winowajcą był null, a może brak naszej uwagi.

Pozdrawiam Wojtek