¿Confiar en && cortocircuitar seguro en .NET?

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ó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, x se evalúa primero y se convierte a tipo bool . Entonces, si x es true , y se evalúa y convierte a tipo bool , y esto se convierte en el resultado de la operación. De lo contrario, el resultado de la operación es false .

(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 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 declarada 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, x se evalúa primero y se convierte a 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 a tipo T
De lo contrario, y se evalúa, y el operador seleccionado & se invoca en el valor calculado previamente para x convertido a tipo T y el valor calculado para y 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.