Ich möchte das tun
%Vor%Wenn eine der Eigenschaften auf dem Weg null ist, möchte ich, dass der Pfad null ist, oder "" wäre besser.
Gibt es einen eleganten Weg, dies ohne Ternär zu tun?
Idealerweise würde ich dieses Verhalten mögen (ohne die schreckliche Leistung und Hässlichkeit) Zeichenfolgepfad;
%Vor%Danke
C # 6 wurde vor einiger Zeit veröffentlicht und wurde mit dem Null-propagierenden Operator ?.
ausgeliefert, was Ihren Fall vereinfachen würde:
Aus historischen Gründen finden Sie die Antworten zu früheren Sprachversionen unten.
Ich denke, Sie suchen nach dem sicheren Dereferenzierungsoperator von Groovy ?.
, und Sie sind nicht der erste.
Aus dem verlinkten Thema gefällt mir die Lösung am besten diese ( dieser sieht auch ganz nett aus).
Dann können Sie einfach tun:
Sie können den Funktionsnamen immer etwas verkürzen. Dies gibt null zurück, wenn eines der Objekte im Ausdruck null ist, ansonsten ApplicationPath. Für Werttypen müssen Sie am Ende einen Null-Check durchführen. Wie auch immer, es gibt bisher keinen anderen Weg, es sei denn, du willst auf jeder Ebene gegen null prüfen.
Hier ist die oben verwendete Erweiterungsmethode:
%Vor%Sie können etwas wie folgt schreiben:
%Vor% Der einfachste Weg, dieses NullHelpers.GetValueOrNull
zu implementieren, ist wahrscheinlich ungefähr so:
Aber bei weitem der coolste Weg, dies zu lösen, ist die Verwendung von Expression-Bäumen:
%Vor%Dies ist auch der langsamste Weg, Dinge zu tun, da jeder Aufruf einen oder mehrere JIT-Compiler-Aufrufe ausführt, aber ...
Es ist immer noch cool; -)
UPDATE (November 2014)
C # 6 kommt und es wird etwas enthalten, das man Null Propagation Operator nennt, was bedeutet, dass es Sprachunterstützung gibt dafür. Ihr Beispiel kann in C # 6 wie folgt geschrieben werden:
%Vor%Wenn einer der Teile null enthält, gibt der vollständige Ausdruck null zurück.
Der kürzeste und performanteste Pfad besteht darin, die Nullprüfung auf jeder Ebene durchzuführen. Zur Wiederverwendung können Sie diesen Code in eine Hilfsfunktion oder eine Erweiterungsmethode einfügen. Auf diese Weise können Sie über die Funktion sicher darauf zugreifen, aber die Null-Überprüfung wird weiterhin konsistent durchgeführt.
Beispiel:
%Vor%Im Mai 2012, als Sie die Frage gestellt haben, sah ich keine einfachere Lösung als den Versuch, den Sie geliefert haben. Die einzige Alternative - jeden Teil gegen Null mit "if" oder "?" sah hässlicher aus (ist aber möglicherweise ein bisschen schneller).
Entweder musstest du schreiben:
%Vor%oder:
%Vor%beide tun es ohne Ausnahmebehandlung. Beachten Sie, dass beide "Verknüpfungen" verwenden, um die Überprüfung abzubrechen, wenn ein Nullwert gefunden wird.
Aktualisierung (Dezember 2017):
Seit C # Version 6 und höher, gibt es eine bessere Lösung, den sogenannten Elvis
-Operator (auch bekannt als Nullkoaleszenzoperator ?.
und x?[i]
für Arrays), den Sie Kann benutzen. Das obige Beispiel
sieht auf diese Weise viel schöner aus:
%Vor% was genau dasselbe tut und IMHO viel mehr als "nur" syntaktischer Zucker ist. Kombiniert mit einem angehängten ?? value
können Sie einfach null
durch einen anderen Wert ersetzen, z. B.
Dies macht die Variable path
leer, wenn kein Nicht-Null-Wert erhalten werden kann.