2013-05-23 11 views
11

Di seguito sono riportate due istruzioni if ​​che hanno più condizioni che utilizzano operatori logici. Logicamente entrambi sono uguali ma l'ordine di controllo è diverso. Il primo funziona e il secondo fallisce.Ordine di esecuzione delle condizioni in C# Se istruzione

Mi sono riferito a MSDN per verificare se l'ordine di esecuzione delle condizioni definite; ma non ho potuto trovare.

Considerare una condizione di controllo multiplo che ha && come operatore logico. È garantito che controllerà sempre la prima condizione e se ciò non è soddisfatto, la seconda condizione sarà non da verificare?

Ho usato l'approccio 1 e funziona bene. Alla ricerca di un riferimento MSDN che sostenga l'uso.

UPDATE

consultare "short-circuit" evaluation

CODICE

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

cerca "cortocircuito"! – David

risposta

31

Il & & e || operatori in corto circuito. Ovvero:

1) Se & & valuta il suo primo operando come falso, non valuta il suo secondo operando.

2) Se || valuta il suo primo operando come vero, non valuta il suo secondo operando.

Questo ti consente di fare il controllo nullo & & fare qualcosa con oggetto, come se non fosse nullo il secondo operando non viene valutato.

+5

@Lijo Googling ["msdn cortocircuito"] (https://www.google.com/search?q=msdn+short-circuit), primi due risultati - [questo] (http://msdn.microsoft. it/it/us/library/2a723cdk (v = vs.71) .aspx) e [this] (http://msdn.microsoft.com/en-us/library/6373h346 (v = vs.71) .aspx). Sono sufficienti? – Dukeling

8

Si dovrebbe usare:

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

&& volontà cortocircuito e employees.Count non saranno eseguiti se employees è null.

Nel secondo esempio, l'applicazione genera un'eccezione se employees è null quando si tenta di Count gli elementi nella raccolta.

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

2

L'operatore AND-condizionale (& &) esegue un AND logico dei suoi operandi bool, ma valuta solo il suo secondo operando, se necessario.

5

Le condizioni vengono controllate da sinistra a destra. L'operatore && valuterà la condizione giusta solo se la condizione di sinistra è vera.

Sezione 5.3.3.24 del linguaggio C# Specification afferma:

5.3.3.24 & & espressioni

Per un'espressione espr della forma expr-first && expr-second:

· Lo stato assegnazione definitiva di v prima expr-first è la stessa come lo stato assegnazione definitiva di v prima espr.

· Lo stato di assegnazione definito di v prima dello expr-second viene assegnato definitivamente se lo stato di v dopo expr-first è assegnato definitivamente o "assegnato definitivamente dopo l'espressione vera". Altrimenti, non è assegnato in modo definitivo.

· Lo stato assegnazione definitiva di v dopo espr è determinata da:

o Se lo stato di v dopo expr-first viene definitivamente assegnato, allora lo stato di v dopo espr è sicuramente assegnato.

o Altrimenti, se lo stato di v dopo expr-second viene definitivamente assegnato, e lo stato di v dopo expr-first è “definitivamente assegnato dopo falsa espressione”, allora lo stato di v dopo expr è sicuramente assegnato.

o Altrimenti, se lo stato di v dopo expr-second viene definitivamente assegnato o “definitivamente assegnato dopo vera espressione”, allora lo stato di v dopo expr è “definitivamente assegnato dopo vera espressione”.

o Altrimenti, se lo stato di v dopo expr-first è “sicuramente assegnato dopo falsa espressione”, e lo stato di v dopo expr-second è “sicuramente assegnato dopo falsa espressione”, allora lo stato di v dopo expr viene “definitamente assegnati dopo la falsa espressione ".

o In caso contrario, lo stato di v dopo expr non è assegnato in modo definitivo.

Quindi questo rende chiaro che espr-primo viene sempre valutata e, se vero allora, e solo allora, espr secondi è anche valutata.

2

da sinistra a destra mentre l'espressione è ancora discutibile.

0

È garantito che controllerà sempre la prima condizione e se non è soddisfatto la seconda condizione non verrà controllata?

La risposta breve è sì.

0

Vedere, ad esempio, questa pagina MSDN per && che descrive la valutazione di cortocircuito.

È possibile verificare o dimostrare sequenza di esecuzione simili:

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

si ottiene 3 in entrambi i casi - che dimostra, che in entrambi i casi il comportamento di cortocircuito avviene. D'altra parte, è possibile utilizzare il '&' o '|', rispettivamente, operatore logico, per impedirlo. Tale otterrà un risultato di 4, poiché entrambe le condizioni sono state valutate.

2

& & e || gli operatori sono spesso usati per verificare le condizioni dell'oggetto.

1) La condizione "& &" valuta il suo primo operando come falso, non valuta il suo secondo operando. Se restituisce true, la seconda condizione viene valutata. Se la seconda condizione è vera, solo essa restituirà true. Quindi & & può essere usato per assicurarsi che tutte le condizioni siano soddisfatte come valide.

2) Il "||" condizione valuta il suo primo operando come vero, non valuta il suo secondo operando. Se la prima condizione viene valutata come falsa, solo essa valuterà la seconda condizione. Se è soddisfatto, allora ritornerà vero. Altrimenti, falso.

Problemi correlati