2013-07-26 16 views
7

Mam kilka zwykłych starych obiektów C#, które są zwracane przez interfejs API i mają kilka warstw zagnieżdżonych w nich obiektów POCO. Muszę uzyskać dostęp do pól zawartych głęboko w tych strukturach, ale ponieważ interfejs API pozostawia te zagnieżdżone obiekty jako puste, gdy brakuje danych, muszę sam wykonać wiele kontroli zerowych, aby uzyskać dostęp do pola, które naprawdę chcę.Kontrola zerowa w zagnieżdżonych obiektach

if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... } 

Najkrótsza forma, jaką wymyśliłem, to korzystanie z operatora trójskładnikowego.

obj != null && obj.Inner != null && obj.Inner.Innerer != null ? obj.Inner.Innerer.Field : null; 

Czy C# ma jakiś sposób na zrobienie tego bez konieczności wypisywania wszystkich porównań? Naprawdę chciałbym czegoś krótkiego i prostego, jak:

obj.Inner.Innerer.Field ?? null; 

Ale to tylko sprawdza Pole dla wartości zerowej.

+0

Co powiesz na [this] (http://stackoverflow.com/questions/17657942/nice-way-to-avoid-null-checks-in-ifs/17663536#17663536)? – rene

+0

Hmm, metoda 'f' jest zdecydowanie zbyt niechlujna. To sprawia, że ​​linia kodu jest krótsza, ale powiedziałbym, że trójskładnik jest łatwiejszy do zrozumienia. Metoda 'tc' jest dość blisko, ale rzuca wyjątek w metodzie, która jest karą za wydajność (szczególnie w porównaniu do sprawdzania zerowego). Tak blisko, ale nie dokładnie to, na co mam nadzieję. – Syon

+0

Pomysł polega na tym, że możesz spróbować uzyskać bezpośredni dostęp do Inner.Innerer.Field podczas próby złapania wyjątku zerowego. Jeśli cokolwiek przy drodze ma wartość NULL, wyjątek zostaje przechwycony i zwracana jest wartość null. W przeciwnym razie zwracasz wartość. – KappaG3

Odpowiedz

0

To nie jest piękny, ale można napisać funkcje dostępowe w kodzie, które hermetyzacji null kontrole więc trzeba tylko zrobić to w jednym miejscu. E.g.

Innerer GetInnerer() 
{ 
    if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) 
    { 
    return obj.Inner.Innerer; 
    } 

    return null; 
} 

W ten sposób można to tak nazwać: if (myObject.GetInnerer() != null).... Trzeba by utworzyć pewną liczbę tych funkcji, ale przynajmniej poruszyłoby to "gulierność" zerowego sprawdzania w jednej lokalizacji.