2017-06-28 7 views
11

Mit der Einführung von Null-Conditional Operators in C#, für die folgende Auswertung,Null-bedingter Operator und! =

if (instance != null && instance.Val != 0) 

Wenn ich es auf diese Weise neu zu schreiben,

if (instance?.Val != 0) 

es bewertet werden true wenn die Instanz eine Nullreferenz ist; Es verhält sich wie

if (instance == null || instance.Val != 0) 

Also, was ist der richtige Weg, um die Bewertung mit dieser neuen Syntax neu schreiben?

Edit:

instance ist ein Feld eines großen Objekts, das von JSON deserialisiert wird. Es gibt einige Codeteile wie diese, überprüfen Sie zuerst, ob das Feld in der JSON ist, wenn es ist, überprüfen Sie, ob die Val-Eigenschaft NICHT gleich einer Konstanten ist, nur beide Bedingungen sind wahr, machen Sie eine Operation.

Der Code selbst Refactoring kann der logische Fluss mehr „macht Sinn“ zu machen, wie von Peter in seinem Kommentar angezeigt, obwohl in dieser Frage, die ich bin interessiert an, wie null-conditional operators mit != zu verwenden.

+2

Ich wäre versucht etwas zu tun, wie 'if ((Beispiel? .Val ?? 0)! = 0)' – john

+1

Eigentlich verhält es sich wie 'Instanz? .Val! = 0', wo seit der Kurzform circuited 'null' kann unmöglich gleich '0' sein, der ganze Ausdruck ist 'wahr'. Ehrlich gesagt gibt es nicht genug Kontext, um zu wissen, was _ "der richtige Weg" _ ist, um den Ausdruck anzusprechen. Es erscheint mir komisch, dass sowohl ein 'Null'-Wert als auch ein Null-Wert beide zum selben Code-Ausführungsblock führen. Angesichts der Tatsache, dass Sie sich in dieser Situation befinden, gibt es vielleicht sogar noch eine bessere Möglichkeit, sich dem Szenario zu nähern. Oder vielleicht, versuche einfach nicht, hier null-bedingungslos zu schuhen, denn alles, was es tun wird, ist, den Code _less_ lesbar zu machen. –

+1

Ich habe eine [Geige] (https://dotnetfiddle.net/kf96px) des Problems erstellt. Peter, es scheint ein Wächter gegen die Ausführung einer Aktion zu sein, es sei denn, Val hat einen Wert ungleich null/ungleich null, was mir nicht falsch erscheint, wenn Sie etwas wie eine PATCH-API-Methode erstellen. – john

Antwort

6

Mit Null-Conditional Operator zurückgegebene Wert immer null sein

if ((instance?.Val ?? 0) != 0) 

Wenn Instanz null war, dann Instanz? .val auch null sein wird (wahrscheinlich int? In Ihrem Fall). So sollten Sie immer für NULL-Werte überprüfen, bevor sie mit etwas zu vergleichen:

if ((instance?.Val ?? 0) != 0) 

Das bedeutet: Wenn Instanz .val null ist (weil Instanz null ist), dann 0 zurück Ansonsten instance.Val zurückkehren?. Als nächstes vergleiche diesen Wert mit 0 (ist nicht gleich).

7

Sie könnten die Verwendung von null coallescing Betreiber machen:

instance?.Val ?? 0 

Wenn instance null ist oder instance ist nicht null, aber Val ist, der obige Ausdruck auf 0 Andernfalls ist der Wert von Val auswerten würde würde zurückgegeben werden.

2
if ((instance?.Val).GetValueOrDefault() != 0) 

die? Bedingter Operator behandelt die Eigenschaft .Val automatisch als Nullwert.

+0

Ja, und '(Instanz? .Val) .GetValueOrDefault()' ist nach der Kompilierung dasselbe wie '(Instanz? .Val ?? 0)', wobei '0' die Kompilierzeitkonstante ist, die auch als 'Standard' bezeichnet wird (int) '. –