2012-07-06 12 views
43

Se ho un'istruzione If con 2 condizioni - e la prima non riesce, verrà considerata anche la seconda condizione o andrà direttamente allo else? Quindi, nel seguente esempio, se myList.Count == 0, sarà confrontato con "valore" con myString o sarà semplicemente uguale a else?Una istruzione IF smetterà di valutare se fallisce la prima condizione?

if(myList.Count > 0 && myString.Equals("value")) 
{ 
//Do something 
} 
else 
{ 
//Do something else 
} 
+7

Gli * operatori logici booleani * in C# sono "cortocircuiti". Lì, un sacco di parole chiave. –

+1

Si noti che non è l'istruzione 'if' che sta facendo ciò, è una proprietà degli operatori boolan AND e OR. – unwind

risposta

67

Si interromperà la valutazione perché si sta utilizzando la doppia e commerciale & & operatore. Questo è chiamato short-circuiting.

Se è stato modificato ad un singolo commerciale:

if(myList.Count > 0 & myString.Equals("value")) 

sarebbe valutare sia.

+0

Grazie mille Paolo, +1. Quando vorresti effettivamente usare l'operatore & allora (cioè quando vorresti vedere anche il secondo se la prima condizione era falsa)? –

+4

In questa situazione certamente non lo faresti. Potresti usarlo se la tua seconda condizione fosse una chiamata di funzione che eseguiva alcuni aggiornamenti che volevi accadere a prescindere (ma non so perché lo faresti). –

+1

@DeeMac Considera il codice: 'public bool DoAllWork() {return DoWork() & DoExtraWork(); } 'Perché usiamo un singolo' & 'il lavoro extra sarà fatto anche se il primo metodo call (' DoWork() ') restituisce' false'. Se avessimo usato '&&', il lavoro aggiuntivo sarebbe stato eseguito solo se la prima chiamata restituiva 'true'. Ma la maggior parte dei programmatori non usa mai l'operatore '&' con i booleani, immagino. Con i tipi interi (che contengono più informazioni di 1 bit), è un'altra storia. –

16

No, non verrà preso in considerazione. (Questo è noto come short circuiting.)

Il compilatore è abbastanza intelligente (e richiesto dalla specifica del linguaggio) per sapere che se la prima condizione è false, non v'è alcun modo di espressione valuterà a true.

E Jacob rilevato per ||, quando la prima condizione è true, la seconda condizione non verrà valutata.

+2

E viceversa con || - la seconda opzione non sarà valutata se la prima è 'true'. –

+0

Aggiorno la risposta per riflettere i commenti di @JacobRaihle. – MBen

3

No, seconda condizione verrà ignorato se si utilizza &&,

Se si utilizza & sarà considerato

+0

Ah, giusto, non mi rendevo conto che era persino un operatore ad essere onesto. –

1

Nel tuo esempio, la seconda istruzione sarà valutata solo se la prima fallisce. L'AND logico && restituirà solo true quando entrambi gli operandi sono veri, ovvero valutazione di cortocircuito.

7

Se l'operatore logico è AND (& &), l'istruzione IF valuterà la prima espressione - se la prima è falsa, non valuterà la seconda. Questo è utile per verificare se la variabile è null prima di chiamare il metodo sul riferimento - per evitare l'eccezione del puntatore nullo

Se l'operatore logico è OR (||), allora l'istruzione IF valuterà la prima espressione - se la prima è vera, non valuterebbe il secondo.

compilatori e runtime sono ottimizzati per questo comportamento

1

.NET supporta short circuiting così quando prima condizione va fallire, esso non controlla la seconda condtion .... In C# || e & & sono le versioni cortocircuitate degli operatori logici | e & rispettivamente .... è spesso troppo veloce ...

2

consideri il folowing:

static int? x; 
static int? y; 

static void Main(string[] args) 
{ 
    x = 5; 
    if (testx() & testy()) 
    { 
     Console.WriteLine("test"); 
    } 
} 

static Boolean testx() 
{ 
    return x == 3; 
} 

static Boolean testy() 
{ 
    return y == 10; 
} 

Se si traccia attraverso le funzioni sia della testx e irascibili sono evaulated anche se testx era falso.

Se si modifica il test su & &, solo il primo è stato verificato.

0

L'espressione verrà valutata da sinistra a destra perché è un'operazione AND logica. Se falso, interromperà la valutazione. Ha anche la più grande precedenza delle operazioni nella tua espressione.

Il condizionale-operatore AND (& &) esegui una logica-AND dei suoi operandi bool, ma valuta solo il suo secondo operando se necessario. Conditional And Operator (&&) MSDN

Ecco un set di sections listing the C# operators starting with the highest precedence to the lowest.

Problemi correlati