switch - Orden de ejecución de condiciones en C#Si declaración
instrucción switch (8)
Hay dos instrucciones if a continuación que tienen múltiples condiciones utilizando operadores lógicos. Lógicamente ambos son iguales pero el orden de verificación difiere. El primero funciona y el segundo falla.
Me referí a MSDN para verificar si el orden de ejecución de las condiciones definidas; Pero no pude encontrar.
Considere una condición de verificación múltiple que tiene &&
como el operador lógico. ¿Se garantiza que siempre comprobará la primera condición y, si no se cumple, la segunda condición no se verificará?
Solía usar el enfoque 1 y funciona bien. Buscando una referencia de MSDN que justifique el uso.
ACTUALIZAR
Consulte la evaluación de "cortocircuito"
CÓDIGO
List<string> employees = null;
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
if (employees.Count > 0 && employees != null)
{
string theEmployee = employees[0];
}
¿Se garantiza que siempre comprobará la primera condición y, si no se cumple, la segunda condición no se verificará?
La respuesta corta es sí.
Consulte, por ejemplo, esta página de MSDN para && que describe la evaluación de cortocircuito.
Puede verificar o probar la secuencia de ejecución de esta manera:
int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);
Obtiene 3 en ambos casos, lo que demuestra que en ambos casos se produce el comportamiento de cortocircuito. Por otro lado, puede usar el operador lógico ''&'' o ''|'', respectivamente, para evitarlo. Así obtendrás un resultado de 4, porque ambas condiciones han sido evaluadas.
De izquierda a derecha, mientras que la expresión sigue siendo cuestionable.
Deberías usar:
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
&&
cortocircuitos y employees.Count
. El recuento no se ejecutará si los employees
son null
.
En su segundo ejemplo, la aplicación lanzará una excepción si los employees
son null
cuando intenta Count
los elementos de la colección.
El && y || Operadores de cortocircuito. Es decir:
1) Si && evalúa su primer operando como falso, no evalúa su segundo operando.
2) Si || evalúa su primer operando como verdadero, no evalúa su segundo operando.
Esto le permite hacer una comprobación nula y hacer algo con el objeto, como si no fuera nulo, el segundo operando no se evalúa.
El && y || los operadores se utilizan a menudo para comprobar las condiciones del objeto.
1) La condición "&&" evalúa su primer operando como falso, no evalúa su segundo operando. Si devuelve true, se evalúa la segunda condición. Si la segunda condición es verdadera, entonces solo se devolverá verdadera. Se puede utilizar &&& para asegurarse de que todas las condiciones se cumplen como válidas.
2) El "||" condición evalúa su primer operando como verdadero, no evalúa su segundo operando. Si la primera condición se evalúa como falsa, solo se evaluará a la segunda condición. Si está satisfecho, entonces devolverá verdadero. De lo contrario, falso.
El operador Y condicional (&&) realiza un AND lógico de sus operandos bool, pero solo evalúa su segundo operando si es necesario.
Las condiciones se verifican de izquierda a derecha. El operador &&
solo evaluará la condición correcta si la condición izquierda es verdadera.
La sección 5.3.3.24 de la Especificación de lenguaje C # establece:
5.3.3.24 && expresiones
Para una expresión expr del formulario
expr-first && expr-second
:· El estado de asignación definido de v antes de
expr-first
es el mismo que el estado de asignación definido de v antes de expr.· El estado de asignación definido de v antes de
expr-second
se asigna definitivamente si el estado de v después deexpr-first
se asigna definitivamente o "definitivamente se asigna después de la expresión verdadera". De lo contrario, no se asigna definitivamente.· El estado de asignación definido de v después de expr está determinado por:
o Si el estado de v después de
expr-first
se asigna definitivamente, entonces el estado de v después de expr se asigna definitivamente.o De lo contrario, si el estado de v después de
expr-second
se asigna definitivamente, y el estado de v después deexpr-first
se “asigna definitivamente después de una expresión falsa”, entonces el estado de v después de expr se asigna definitivamente.o De lo contrario, si el estado de v después de
expr-second
se asigna definitivamente o "definitivamente se asigna después de la expresión verdadera", entonces el estado de v después de expr se "asigna definitivamente después de la expresión verdadera".o De lo contrario, si el estado de v después de
expr-first
se “asigna definitivamente después de una expresión falsa”, y el estado de v después deexpr-second
se “asigna definitivamente después de una expresión falsa”, entonces el estado de v después de expr se “asigna definitivamente después de falsa expresión ".o De lo contrario, el estado de v después de expr no se asigna definitivamente.
Así que esto deja claro que expr-first siempre se evalúa y si es verdadero, y solo entonces, también se evalúa expr-second .