2012-07-06 14 views
43

Si tengo una declaración If con 2 condiciones, y la primera falla, ¿se considerará siquiera la 2ª condición o irá directamente al else? Entonces, en el siguiente ejemplo, si es myList.Count == 0, ¿se comparará el myString con el "valor" o se limitará directamente al else?¿Una instrucción IF dejará de evaluar si falla la primera condición?

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

Los * operadores lógicos booleanos * en C# son "cortocircuitos". Allí, muchas palabras clave. –

+1

Tenga en cuenta que no es la instrucción 'if' que está haciendo esto, es una propiedad de los operadores AND y OR boolan. – unwind

Respuesta

67

Dejará de evaluar porque está usando el operador & & de doble ampersand. Esto se llama short-circuiting.

Si la ha cambiado a un solo signo:

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

sería evaluar tanto.

+0

Muchas gracias Paul, +1. ¿Cuándo querrías usar realmente el operador & (es decir, cuándo querrías mirar el 2 si la 1era condición era falsa)? –

+4

En esta situación, ciertamente no lo haría. Puede utilizarlo si su segunda condición fue una llamada de función que realizó algunas actualizaciones que desea que ocurra independientemente (pero no sé por qué lo haría). –

+1

@DeeMac Considere el código: 'public bool DoAllWork() {return DoWork() & DoExtraWork(); } 'Debido a que usamos un solo' & ', el trabajo adicional se realizará incluso si la primera llamada al método (' DoWork() ') devuelve' false'. Si hubiéramos utilizado '&&' en su lugar, el trabajo adicional solo se realizaría si la primera llamada devolvía 'true'. Pero la mayoría de los programadores nunca usan el operador '&' con booleanos, supongo. Con tipos enteros (que contienen más información que 1 bit), es otra historia. –

16

No, no se considerará. (Esto se conoce como short circuiting.)

El compilador es suficientemente inteligente (y requerido por la especificación del lenguaje) para saber que si la primera condición es false, no hay manera de expresión evaluará a true.

Y como Jacob señaló para ||, cuando la primera condición es true, la segunda condición no se evaluará.

+2

y viceversa con || - la segunda opción no se evaluará si la primera es 'verdadera'. –

+0

Actualizo la respuesta para reflejar los comentarios de @JacobRaihle. – MBen

3

No, segunda condición se omitirá si se utiliza &&,

Si utiliza & se considerará

+0

Ah, claro, no me di cuenta de que era incluso un operador para ser honesto. –

1

En el ejemplo, sólo se evaluará la segunda sentencia si el primero falla. El AND lógico && solo devolverá true cuando ambos operandos son verdaderos, también conocido como evaluación de cortocircuitos.

7

Si el operador lógico es Y (& &), la instrucción IF evaluaría la primera expresión; si la primera es falsa, no evaluaría la segunda. Esto es útil para verificar si la variable es nula antes de llamar al método en la referencia: para evitar la excepción del puntero nulo

Si el operador lógico es OR (||), la instrucción IF evaluaría la primera expresión, si la primera es verdadera, no evaluaría el segundo.

compiladores y tiempos de ejecución están optimizados para este comportamiento

1

.NET soporta short circuiting así que cuando primera condición pasa falle, no va a comprobar la segunda condtion de .... En C# || y & & son las versiones en cortocircuito de los operadores lógicos | y & respectivamente .... A menudo es más rápido también ...

2

Considere el 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; 
} 

Si se desplaza a través de funciones tanto en el testx y están irritables evaulated a pesar de que testx era falso.

Si cambia la prueba a & &, solo se verificó la primera.

0

La expresión se evaluará de izquierda a derecha porque es una operación AND lógica. Si es falso, detendrá la evaluación. También tiene la mayor precedencia de las operaciones en tu expresión.

El condicional-operador AND (& &) realiza una lógica-Y de sus operandos BOOL, pero sólo evalúa su segundo operando si es necesario. Conditional And Operator (&&) MSDN

Aquí hay un conjunto de sections listing the C# operators starting with the highest precedence to the lowest.

Cuestiones relacionadas