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 && ycorresponde a la operaciónx & y, excepto queyse evalúa solo sixestrue
...
La operaciónx && yse evalúa como(bool)x ? (bool)y : false(bool)x ? (bool)y : false. En otras palabras, primero se evalúaxy se convierte a tipobool. Luego, sixestrue,yse 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 && yse 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 falsedeclarado 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
xy se convierte al tipoTy se invoca eloperator falseen el resultado para determinar sixes definitivamentefalse.
Entonces, sixes definitivamentefalse, el resultado de la operación es el valor previamente calculado paraxconvertido al tipoT
De lo contrario, se evalúa y, y el operador seleccionado se invoca en el valor previamente calculado paraxconvertido al tipoTy el valor calculado paraypara 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.