Ich habe den folgenden hässlichen Code:
%Vor%Gibt es eine Möglichkeit, eine Kettenüberprüfung auf Nullwerte in C # durchzuführen, damit ich nicht jede einzelne Ebene überprüfen muss?
Einer der Vorschläge in C # 6 wäre das Hinzufügen eines neuen Nullpropagationsoperator .
Dies wird Ihnen (hoffentlich) erlauben zu schreiben:
%Vor%Leider gibt es an dieser Stelle in der Sprache nichts, was dies angeht.
Momentan gibt es so etwas nicht, aber es könnte bald auf .NET kommen. Es gibt einen bekannten User-Voice-Thread zum Thema . Und wie in Dieser Artikel hat das Visual Studio-Team kürzlich angekündigt:
Wir denken ernsthaft über diese Funktion für C # und VB nach und werden es sein Prototyping in den kommenden Monaten.
Bearbeiten: und wie in Reed Copseys Antwort oben erwähnt, ist es jetzt eine geplante Ergänzung für C # 6. Es gibt bessere Details auf den verlinkten Codeplex-Seiten.
Es gibt keine integrierte Unterstützung dafür, aber Sie können dafür eine Erweiterungsmethode verwenden:
%Vor%Dann rufe es an:
%Vor%Sie brauchen Monaden und Monadische Nullprüfung. Schauen Sie sich das Monads.Net-Paket an. Es kann dabei helfen, Null-Tests zu vereinfachen und Werte aus den tiefen Navigationseigenschaften abzurufen
Etwas wie
%Vor%Wenn Sie einen Standardwert haben wollten,
%Vor%Sie können die Werte mithilfe von Lambda-Ausdrücken langsam auswerten. Dies ist ein Overkill für einen einfachen Null-Check, kann aber nützlich sein, um komplexere Ausdrücke auf "fließende" Weise zu verketten.
Dies ist ein vollständiges Beispiel (Code in Entwurfsqualität), das in eine Konsolenanwendung oder LINQPad eingefügt werden kann.
%Vor%Noch einmal: Sie sollten dies wahrscheinlich nicht anstelle von einfachen Null-Tests verwenden, weil es eine komplexe -Konvertierung enthält, aber es ist ein interessantes Muster.
Wie gesagt, gibt es einen Plan, dass c # 6.0 den Operator ?
implementiert, um diesen Prozess etwas zu erleichtern. Wenn Sie nicht warten können, würde ich vorschlagen, einen Lambda-Ausdruck und eine einfache Hilfsfunktion zu verwenden, um dies zu lösen.
Dies könnte verwendet werden int value = NestedProperty<First,int>(blank,f => f.Second.Third.id);
wie in der Demo unten gezeigt
Programm
%Vor%einfache Demostruktur
%Vor%Seit 3.5 (vielleicht früher) können Sie eine sehr einfache Erweiterungsmethode schreiben
%Vor%Sie können diese Methode noch kürzer nennen und dann wie folgt verwenden
%Vor%Also Quellklassen sind:
%Vor%