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 el && se evalúa como falso antes de que se ejecute la segunda parte.
Sí. En C # &&
y ||
están en cortocircuito y, por lo tanto, evalúa el lado derecho solo si el lado izquierdo aún no determina el resultado. Los operadores &
y |
por otro lado, no cortocircuites y siempre evalúa ambos lados.
La especificación dice:
El
&&
y||
los operadores se llaman operadores lógicos condicionales. También se les llama operadores lógicos de “cortocircuito”.
…
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,x
se evalúa primero y se convierte a tipobool
. Entonces, six
estrue
,y
se evalúa y convierte a tipobool
, y esto se convierte en el resultado de la operación. De lo contrario, el resultado de la operación esfalse
.
(C # Language Specification Version 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 los tipos donde 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
declarada 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,
x
se evalúa primero y se convierte a 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 a tipoT
De lo contrario,y
se evalúa, y el operador seleccionado&
se invoca en el valor calculado previamente parax
convertido a tipoT
y el valor calculado paray
para producir el resultado de la operación.
(C # Language Specification Version 4.0 – 7.12.2 Operadores lógicos condicionales definidos por el usuario)
Sí, C # usa un cortocircuito lógico.
Tenga en cuenta que aunque C # (y algunos otros lenguajes .NET) se comportan de esta manera, es una propiedad del lenguaje, no del CLR.
Sé que llego tarde a la fiesta, pero en C # 6.0 también puedes hacerlo:
if(myObj?.SomeString != null)
Que es lo mismo que arriba.
Ver también: ¿Qué hace el signo de interrogación y el operador de punto? significa en C # 6.0?
Tu código es seguro – && y || ambos están en cortocircuito. Puede utilizar operadores no en cortocircuito, 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 se ejecutaran ambos lados.
Nota interesante El ejemplo anterior es bastante más rápido que el método IsNullorEmpty.
Es perfectamente seguro. C # es uno de esos idiomas.
Sí, C # y la mayoría de los idiomas calculan si las oraciones de izquierda a derecha.
Por cierto, VB6 calculará todo y lanzará una excepción si es nulo …
En C #, &&
y ||
están en cortocircuito, lo que significa que la primera condición se evalúa y el rest se ignora si se determina la respuesta.
En VB.NET, AndAlso
y OrElse
también están en cortocircuito.
En javaScript, &&
y ||
están en cortocircuito también.
Menciono VB.NET para mostrar que el feo pelirrojo de .net también tiene cosas geniales también, a veces.
Menciono javaScript, porque si estás haciendo desarrollo web entonces probablemente también uses javaScript.