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