operator not logical diferente andalso c# .net operators logical-operators short-circuiting

logical - not en c#



¿Confiar en && es seguro en corto circuito en.NET? (9)

Supongamos que myObj es nulo. ¿Es seguro escribir esto?

if(myObj != null && myObj.SomeString != null)

Sé que algunos idiomas no ejecutarán la segunda expresión porque && se evalúa como falso antes de que se ejecute la segunda parte.


En C #, && y || están en cortocircuito, lo que significa que la primera condición se evalúa y el resto se ignora si se determina la respuesta.

En VB.NET, AndAlso y OrElse también están en cortocircuito.

En javaScript, && y || también están en cortocircuito.

Menciono VB.NET para mostrar que el feo hijastro pelirrojo de .net también tiene cosas geniales, a veces.

Menciono javaScript, porque si está haciendo un desarrollo web, probablemente también use javaScript.


Es perfectamente seguro. C # es uno de esos idiomas.



Sí, C # utiliza el cortocircuito lógico.

Tenga en cuenta que aunque C # (y algunos otros lenguajes .NET) se comportan de esta manera, es una propiedad del idioma, no del CLR.


Sí, C # y la mayoría de los idiomas calculan las oraciones if de izquierda a derecha.

Por cierto, VB6 computará todo y lanzará una excepción si es nulo ...


Sí. En C # && y || están cortocircuitados y, por lo tanto, evalúan el lado derecho solo si el lado izquierdo no determina el resultado. Los operadores y | por otro lado, no cortocircuite y siempre evalúe ambos lados.

La especificación dice:

El && y || Los operadores se denominan operadores lógicos condicionales. También se les llama operadores lógicos de “corto circuito”.
...
La operación x && y corresponde a la operación x & y , excepto que y se evalúa solo si x es true
...
La operación x && y se evalúa como (bool)x ? (bool)y : false (bool)x ? (bool)y : false . En otras palabras, primero se evalúa x y se convierte a tipo bool . Luego, si x es true , y se evalúa y convierte al tipo bool , y esto se convierte en el resultado de la operación. De lo contrario, el resultado de la operación es false .

(Especificación de lenguaje C # versión 4.0 - 7.12 Operadores lógicos condicionales)

Una propiedad interesante de && y || es que están en cortocircuito incluso si no operan en bools, pero tipos en los que el usuario sobrecargó a los operadores & o | Junto con el operador true y false .

La operación x && y se evalúa como T.false((T)x) ? (T)x : T.&((T)x, y) T.false((T)x) ? (T)x : T.&((T)x, y) , donde T.false((T)x) es una invocación del operator false declarado en T , y T.&((T)x , y) es una invocación del operator & seleccionado operator & . Además, el valor (T) x solo se evaluará una vez.

En otras palabras, primero se evalúa x y se convierte al tipo T y se invoca el operator false en el resultado para determinar si x es definitivamente false .
Entonces, si x es definitivamente false , el resultado de la operación es el valor previamente calculado para x convertido al tipo T
De lo contrario, se evalúa y, y el operador seleccionado se invoca en el valor previamente calculado para x convertido al tipo T y el valor calculado para y para producir el resultado de la operación.

(Especificación de lenguaje C # versión 4.0 - 7.12.2 Operadores lógicos condicionales definidos por el usuario)


Su código es seguro - && y || ambos están en cortocircuito. Puede usar operadores no cortocircuitados y / o, que evalúan ambos extremos, pero realmente no veo eso en muchos códigos de producción.


seguro, es seguro en C #, si el primer operando es falso entonces el segundo nunca se evalúa.


un ejemplo es

if(strString != null && strString.Length > 0)

Esta línea causaría una excepción nula si ambos lados se ejecutaran.

Nota al margen interesante. El ejemplo anterior es bastante más rápido que el método IsNullorEmpty.