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é que llego tarde a la fiesta, pero en C # 6.0 también puedes hacer esto:
if(myObj?.SomeString != null)
Que es lo mismo que el anterior.
También vea: ¿Qué significa el signo de interrogación y el operador de puntos? significa en C # 6.0?
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ónx && y
corresponde a la operaciónx & y
, excepto quey
se evalúa solo six
estrue
...
La operaciónx && y
se evalúa como(bool)x ? (bool)y : false
(bool)x ? (bool)y : false
. En otras palabras, primero se evalúax
y se convierte a tipobool
. Luego, six
estrue
,y
se evalúa y convierte al tipobool
, y esto se convierte en el resultado de la operación. De lo contrario, el resultado de la operación esfalse
.
(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 comoT.false((T)x) ? (T)x : T.&((T)x, y)
T.false((T)x) ? (T)x : T.&((T)x, y)
, dondeT.false((T)x)
es una invocación deloperator false
declarado enT
, yT.&((T)x
, y) es una invocación deloperator &
seleccionadooperator &
. Además, el valor (T) x solo se evaluará una vez.En otras palabras, primero se evalúa
x
y se convierte al tipoT
y se invoca eloperator false
en el resultado para determinar six
es definitivamentefalse
.
Entonces, six
es definitivamentefalse
, el resultado de la operación es el valor previamente calculado parax
convertido al tipoT
De lo contrario, se evalúa y, y el operador seleccionado se invoca en el valor previamente calculado parax
convertido al tipoT
y el valor calculado paray
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.