Elegante Methode zur Vermeidung von NullReferenceException in C #

7

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

    
AK_ 30.05.2012, 11:44
quelle

5 Antworten

11

[BEARBEITEN]

C # 6 wurde vor einiger Zeit veröffentlicht und wurde mit dem Null-propagierenden Operator ?. ausgeliefert, was Ihren Fall vereinfachen würde:

%Vor%

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:

%Vor%

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%     
Patryk Ćwiek 30.05.2012, 11:49
quelle
4

Sie können etwas wie folgt schreiben:

%Vor%

Der einfachste Weg, dieses NullHelpers.GetValueOrNull zu implementieren, ist wahrscheinlich ungefähr so:

%Vor%

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.

    
Steven 30.05.2012 12:15
quelle
2

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%     
STW 30.05.2012 11:48
quelle
2

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

%Vor%

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.

%Vor%

Dies macht die Variable path leer, wenn kein Nicht-Null-Wert erhalten werden kann.

    
Matt 30.05.2012 12:35
quelle
1

In C # 7.0

Sie können auch das "!" Ausrufezeichen verwenden, um Nullwerte zu vermeiden

%Vor%     
tabby 20.12.2017 09:32
quelle

Tags und Links