2016-05-19 26 views
-1

Ich konfrontiert ein Szenario, um Null Referenz für die äußeren und inneren Objekte zu überprüfen. Es besteht die Möglichkeit, dass das äußere Objekt auch ein Null- und inneres Objekt sein kann.Wie funktioniert logisches UND (&&) in C#?

if (outerObject != null && outerObject.innerObject != null) 
{ 
    outerObject.innerObject.DoSomething(); 
} 

Wenn der zweite Ausdruck in wenn ausgewertet dann NullRefence Exception wird geworfen werden.

Ich habe eine Option zu gehen mit verschachtelter wenn wie

if(outerObject != null) 
{ 
    if(outerObject.innerObject != null) 
    { 
     outerObject.innerObject.DoSomething(); 
    } 
} 

Ich möchte nur wissen, ob oder nicht der zweite Ausdruck selbst ausgewertet wird, wenn der erste Ausdruck falsch ist?

Welches ist das Beste?

+7

Fisch oder Geflügel, die Codegenerierung für das 1. Schnipsel ist vollständig identisch mit dem zweiten Schnipsel. Genannt [Kurzschlussauswertung] (https://msdn.microsoft.com/en-us/library/2a723cdk.aspx). Die große Anzahl von Programmierern befürwortet das erste Snippet, es liegt an Ihnen, es mit Ihren Teammitgliedern zu besprechen oder Ihre eigene Wahl zu treffen. –

+1

CSharp verwendet [Kurzschlussauswertung] (https://en.wikipedia.org/wiki/Short-circuit_evaluation), sodass der zweite Vergleich nur bei Bedarf durchgeführt wird. – martinstoeckli

+1

Es ist so einfach und ich glaube, dass es in jedem Buch erwähnt wird (haben Sie einen gelesen?).Außerdem ist es so einfach zu testen, schreiben Sie mehrere Methoden, die 'bool' zurückgeben und mit ihnen spielen (mit' false' oder 'true'), während Sie eine Bedingung wie' if (Methode1() && Methode2() && (Methode3() || Methode4) verwenden())) ... ' – Sinatr

Antwort

4

Die && Betreiber Werke von den ersten Operator/Ausdruck Kontrolle - wenn auswertet auf true, nur dann die zweite betrachtet wird.

also Ihre erste Option ist genug:

if (outerObject != null && outerObject.innerObject != null) 
{ 
    outerObject.innerObject.DoSomething(); 
} 
+2

Nur eine Anmerkung, in den meisten Büchern wird diese Art der Auswertung als "Kurzschluss" Bewertung bezeichnet. – GKalnytskyi

+0

Danke veljkoz –

3

In diesem Fall sind beide gleich. Interessanterweise kann der Compiler den zweiten Code in die erste Anweisung if umwandeln. Sie können einfach tun dies auch:

outerObject?.innerObject?.DoSomething(); 
+0

Der Code sollte in C# 5.0 sein –

2

Die bedingte-AND-Operator (& &) führt eine logische UND der Bool Operanden, sondern nur wertet seinen zweiten Operanden, falls erforderlich. Gelesen here

Wenn der erste Ausdruck falsch ist, wird es nie nach der Sekunde prüfen!

So Ihre erste Option ist gut:

if (outerObject != null && outerObject.innerObject != null) 
{ 
    outerObject.innerObject.DoSomething(); 
} 

Diese auch als short-circuit Auswertung

+0

Danke granmirupa –

4

C# 6.0 unterstützt jetzt ?. Null Conditional Operator bekannt ist. Das heißt, Sie verwandeln kann:

if (outerObject != null && outerObject.innerObject != null) 

zu

if (outerObject?.innerObject != null) 

Auch & & verwendet Kurzauswertung in C#, überprüft er zuerst den linken/ersten Ausdruck dann (wenn seine true) das Recht einer .

+0

Es ist nicht 'Lazy' ist ein Kurzschluss! –

+0

@CallumLinington bearbeitet – Master117

+0

Wenn Sie den Null Conditional Operator einfügen möchten, dann tun Sie es bis zum Ende. Der Code sollte wie folgt aussehen: outerObject? .innerObject? .DoSomething(); Keine 'if'-Anweisung erforderlich. –