2013-01-14 11 views
8

domanda relativa all'operatore BOOLEAN '|' e '||'. L'unica differenza che posso trovare tra questi due operatori è; quando si usa '||' the right side of the expression will not be evaluated if the left side is true.C# operatori booleani - normale vs cortocircuito

Al di fuori della preferenza della persona, perché si dovrebbe usare "|" oltre '||' per i test booleani?

if(true | false) 
{ 
do something 
} 

vs 
if (true || false) 
{ 
do something 
} 
+1

Per assicurarsi che venga valutato anche il lato destro dell'espressione, anche se il lato sinistro è vero, o sto solo affermando l'ovvio? Non è possibile che tu voglia eseguire 2 operazioni ancora se solo una di esse risulta vera, qualcos'altro deve succedere? Sembra un caso possibile per me. – Bazzz

risposta

17

E 'principalmente un problema se l'operazione ha effetti collaterali:

considerare quanto segue:

using(IEnumerator iterator1 = args.GetEnumerator()) 
using (IEnumerator iterator2 = args.GetEnumerator()) 
{ 
    while (iterator1.MoveNext() | iterator2.MoveNext()) 
    { 
     //do stuff 
    } 
} 

Perché le MoveNext operazioni causano effetti collaterali che può essere importante per entrambi i lati del | a essere eseguito indipendentemente dal fatto che il primo sia vero

+2

Buon esempio :) –

+0

In caso di '&' c'è un'altra differenza: i booleani non devono essere 0 o 1 sul CLR quindi '(bool) 1 & (bool) 2' è' false'! (C# non valido ma può essere costruito usando IL). – usr

3

Al di fuori della persona preferenza, perché uno uso '|' oltre '||' per i test booleani?

Proprio perché si potrebbe desidera entrambi i lati da valutare. Potrebbero esserci effetti collaterali che è necessario che si verifichino in entrambi i modi.

È raro, ma è fattibile.

+8

E anche la causa dei bug "divertenti". :) – JerKimball

4

perché si dovrebbe usare '|' oltre '||' per i test booleani?

Se (per qualche motivo) il lato destro presenta effetti collaterali che è necessario che si verifichi.

Questo in genere non è una buona pratica, tuttavia.

Problemi correlati