it-swarm.com.de

Ausführungsreihenfolge der Bedingungen in C # If-Anweisung

Es gibt zwei if-Anweisungen mit mehreren Bedingungen, die logische Operatoren verwenden. Logischerweise sind beide gleich, aber die Reihenfolge der Überprüfung unterscheidet sich. Der erste funktioniert und der zweite scheitert.

Ich bezog mich auf MSDN , um zu überprüfen, ob die Reihenfolge der Ausführung der Bedingungen definiert ist; aber ich konnte nicht finden.

Betrachten Sie eine Mehrfachprüfbedingung mit && als logischem Operator. Ist garantiert, dass es immer die erste Bedingung überprüft und wenn dies nicht erfüllt ist, wird die zweite Bedingung nicht überprüft?

Früher habe ich Ansatz 1 verwendet und er funktioniert gut. Suchen Sie nach einer MSDN-Referenz, die die Verwendung belegt.

UPDATE

Siehe "Kurzschluss" Auswertung

CODE

  List<string> employees = null;  

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

  if (employees.Count > 0 && employees != null)
  {
        string theEmployee = employees[0];
  }
17
Lijo

Die && und || Betreiber Kurzschluss. Das ist:

1) Wenn && seinen ersten Operanden als falsch bewertet, bewertet es seinen zweiten Operanden nicht.

2) Wenn || wertet seinen ersten Operanden als wahr aus, seinen zweiten Operanden wertet er nicht aus.

Auf diese Weise können Sie prüfen, ob && etwas mit dem Objekt zu tun hat, als wäre es nicht null, wird der zweite Operand nicht ausgewertet.

37
Patashu

Du solltest benutzen:

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

&& wird kurzgeschlossen und employees.Count wird nicht ausgeführt, wenn employeesnull ist.

In Ihrem zweiten Beispiel gibt die Anwendung eine Ausnahme aus, wenn employeesnull ist, wenn Sie versuchen, die Elemente in der Auflistung Count zu setzen.

http://msdn.Microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx

9
Darren

Die Bedingungen werden von links nach rechts überprüft. Der Operator && wertet die rechte Bedingung nur aus, wenn die linke Bedingung wahr ist.

In Abschnitt 5.3.3.24 der C # -Sprachenspezifikation heißt es:

5.3.3.24 && Ausdrücke

Für einen Ausdruck expr der Form expr-first && expr-second:

· Der definitive Zuweisungsstatus von v vor expr-first ist der gleiche wie der definitive Zuweisungsstatus von v vor expr.

· Der definitive Zuweisungsstatus von v vor expr-second wird definitiv zugewiesen, wenn der Status von v nach expr-first entweder definitiv zugewiesen oder „definitiv zugewiesen nach wahrem Ausdruck“ ist. Ansonsten ist es nicht eindeutig zugeordnet.

· Der definitive Zuweisungsstatus von v nach expr wird bestimmt durch:

o Wenn der Zustand von v nach expr-first definitiv zugewiesen ist, ist der Zustand von v nach expr definitiv zugewiesen.

o Andernfalls wird, wenn der Zustand von v nach expr-second definitiv zugewiesen ist und der Zustand von v nach expr-first "definitiv nach falschem Ausdruck zugewiesen" ist, der Zustand von v nach expr definitiv zugewiesen.

o Wenn andernfalls der Zustand von v nach expr-second definitiv zugewiesen oder "definitiv nach wahrem Ausdruck zugewiesen" ist, wird der Zustand von v nach expr "definitiv nach wahrem Ausdruck zugewiesen".

o Wenn andernfalls der Zustand von v nach expr-first "definitiv nach falschem Ausdruck zugewiesen" ist und der Zustand von v nach expr-second "definitiv nach falschem Ausdruck zugewiesen" ist, wird der Zustand von v nach expr "definitiv nach falschem Ausdruck zugewiesen". .

o Andernfalls wird der Zustand von v nach expr nicht definitiv zugewiesen.

Dies macht also deutlich, dass Ausdruck-zuerst immer ausgewertet wird und wenn ja, dann und nur dann Ausdruck-Sekunde ebenfalls ausgewertet wird.

7
John Willemse

von links nach rechts, während der Ausdruck noch fraglich ist.

3
G.Y

Die && und || Operatoren werden häufig zur Überprüfung von Objektbedingungen verwendet.

1) Die Bedingung "&&" wertet ihren ersten Operanden als falsch aus, ihren zweiten Operanden wertet sie nicht aus. Wenn es true zurückgibt, wird die zweite Bedingung ausgewertet. Wenn die zweite Bedingung erfüllt ist, wird nur diese zurückgegeben. So kann && verwendet werden, um sicherzustellen, dass alle Bedingungen als gültig erfüllt sind.

2) Das "||" Bedingung wertet ihren ersten Operanden als wahr aus, sie wertet ihren zweiten Operanden nicht aus. Wenn die erste Bedingung als falsch ausgewertet wird, wird nur die zweite Bedingung ausgewertet. Wenn es erfüllt ist, wird es true zurückgeben. Ansonsten falsch.

2
Chirag

Der Bedingte-UND-Operator (&&) führt ein logisches UND seiner Bool-Operanden durch, wertet jedoch seinen zweiten Operanden nur bei Bedarf aus.

2
Frank Rem

Siehe zum Beispiel diese MSDN-Seite für && , die die Kurzschlussbewertung beschreibt.

Sie können die Ausführungsreihenfolge folgendermaßen überprüfen oder beweisen:

int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);

In beiden Fällen erhalten Sie 3 - was zeigt, dass in beiden Fällen das Kurzschlussverhalten auftritt. Andererseits können Sie den logischen Operator '&' bzw. '|' verwenden, um dies zu verhindern. So erhalten Sie ein Ergebnis von 4, da beide Bedingungen ausgewertet wurden.

0
JeffRSon

Ist garantiert, dass die erste Bedingung immer überprüft wird und wenn dies nicht erfüllt ist, wird die zweite Bedingung nicht überprüft?

Kurze Antwort ist ja.

0
yclkvnc