2013-05-23 29 views
11

Istnieją dwa poniższe instrukcje if, które mają wiele warunków za pomocą operatorów logicznych. Logicznie oba są takie same, ale kolejność czeków jest różna. Pierwszy działa, a drugi zawiedzie.Kolejność wykonywania warunków w C# If statement

Przekazałem MSDN w celu sprawdzenia, czy kolejność wykonywania określonych warunków; ale nie mogłem znaleźć.

Należy rozważyć warunek wielokrotnego sprawdzenia, którego operatorem logicznym jest &&. Czy jest zagwarantowane, że zawsze będzie sprawdzać pierwszy warunek, a jeśli nie zostanie spełniony, drugi warunek będzie sprawdzany pod kątem , a nie?

Używałem podejścia 1 i działa dobrze. Poszukuję referencji MSDN uzasadniającej użycie.

UPDATE

Patrz "short-circuit" evaluation

KOD

List<string> employees = null; 

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

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

szukaj "zwarcie"! – David

Odpowiedz

31

& & i || zwarcie operatorów. To jest:

1) Jeśli & & ocenia swój pierwszy operand jako fałszywy, nie ocenia swojego drugiego argumentu.

2) Jeśli || ocenia swój pierwszy operand jako prawdziwy, nie ocenia swojego drugiego argumentu.

Umożliwia to sprawdzenie wartości zerowej & & zrobić coś z obiektem, tak jakby nie było puste, drugi argument nie jest oceniany.

+5

@Lijo Googling ["msdn short-circuit"] (https://www.google.com/search?q=msdn+short-circuit), pierwsze dwa wyniki - [this] (http://msdn.microsoft. com/en-us/library/2a723cdk (v = vs.71) .aspx) i [this] (http://msdn.microsoft.com/en-us/library/6373h346 (v = vs.71) .aspx). Czy to wystarczy? – Dukeling

8

Należy użyć:

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

&& będzie shortcircuit i employees.Count nie zostaną wykonane, jeśli employees jest null.

W twoim drugim przykładzie aplikacja rzuci wyjątek, jeśli employees jest null, gdy próbujesz uzyskać elementy kolekcji w postaci Count.

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

2

Operator warunkowy AND (& &) wykonuje operację logiczną-AND z operandami bool, ale w razie potrzeby ocenia jej drugi operand.

5

Warunki są sprawdzane od lewej do prawej. Operator && oceni tylko prawy warunek, jeśli lewy warunek jest prawdziwy.

Sekcja 5.3.3.24 z języka C# Specyfikację stwierdza:

5.3.3.24 & & wyrażenia

Dla ekspresji wyrażenie formy expr-first && expr-second:

· W określony stan przyporządkowanie v przed expr-first jest taki sam jak określony stan Przyporządkowanie v przed wyr.

· Zdefiniowany stan przypisania v przed expr-second jest definitywnie przypisany, jeśli stan v po expr-first jest albo definitywnie przypisany, albo "zdecydowanie przypisany po prawdziwym wyrażeniu". W przeciwnym razie nie jest definitywnie przypisany.

· W określony stan przyporządkowanie v Po wyrażenie jest określona przez:

o Jeżeli stan v Po expr-first zdecydowanie przypisane, to stan v Po wyrażenie jest zdecydowanie przypisany.

o W przeciwnym razie, jeśli stan v po expr-second jest definitywnie przypisany, a stan v po expr-first jest "definitywnie przypisany po fałszywym wyrażeniu", to stan v po wyrażeniu jest definitywnie przypisany.

o W przeciwnym razie, jeśli stan v po expr-second jest definitywnie przypisany lub "definitywnie przypisany po prawdziwym wyrażeniu", wówczas stan v po wyrażeniu jest "definitywnie przypisany po prawdziwym wyrażeniu".

o przeciwnym razie, jeśli stan v po expr-first jest „zdecydowanie przypisane po fałszywej wypowiedzi”, a stan v po expr-second jest „zdecydowanie przypisane po fałszywej wypowiedzi”, a następnie stan v Po wyrażenie jest „zdecydowanie przypisane po fałszywym wyrażeniu ".

o W przeciwnym razie stan v po wyrażeniu nie jest definitywnie przypisany.

Więc to wyjaśnia, że ​​wyrażenie pierwszego zawsze jest oceniane i jeśli jest prawdziwa wtedy i tylko wtedy, wyr-sekundowy jest również oceniany.

2

od lewej do prawej, podczas gdy wyrażenie jest nadal wątpliwe.

0

Czy jest zagwarantowane, że zawsze będzie sprawdzać pierwszy warunek, a jeśli , który nie jest spełniony, drugi warunek nie zostanie sprawdzony?

Krótka odpowiedź brzmi tak.

0

Zobacz na przykład tę stronę MSDN dla &&, która opisuje ocenę zwarcia.

Można sprawdzić lub udowodnić kolejność wykonywania tak:

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

Otrzymasz 3 w obu przypadkach - który wskazuje, że w obu przypadkach zachowanie zwarcie następuje. Z drugiej strony można użyć operatora "&" lub "|" odpowiednio, aby temu zapobiec. Otrzymasz wynik 4, ponieważ oba warunki zostały ocenione.

2

The & & i || operatorzy są często wykorzystywani do sprawdzania warunków obiektu.

1) Stan "& &" ocenia swój pierwszy operand jako fałszywy, nie ocenia swojego drugiego argumentu. Jeśli zwróci true, sprawdzany jest drugi warunek. Jeśli drugi warunek jest prawdziwy, to tylko on zwróci true. Tak więc można użyć & &, aby upewnić się, że wszystkie warunki są spełnione.

2) "||" warunek ocenia swój pierwszy operand jako prawdziwy, nie ocenia swojego drugiego argumentu. Jeśli pierwszy warunek zostanie oceniony jako fałszywy, to tylko on oceni drugi warunek. Jeśli jest usatysfakcjonowany, to zwróci true. W przeciwnym razie false.