2010-06-17 25 views
6

Espero que esto no se haya preguntado antes.Anidado si las declaraciones o no

que tienen un valor lógico anulable llamada boolIsAllowed y si la condición de este modo:

if(boolIsAllowed.HasValue && boolIsAllowed.Value) 
{ 
//do something 
} 

Mi pregunta es la siguiente buena código o habría que ser mejor que lo separa en una sentencia if anidada? ¿Se comprobará la segunda condición si boolIsAllowed.HasValue es igual a false y luego lanza una excepción?

Espero que esta pregunta no sea demasiado estúpida.

Gracias de antemano.

+2

Como mis estados de respuesta - y ha nadie más lo ha señalado - para booleanos anulables puede utilizar GetValueOrDefault (falso), evitando así dos pruebas en su código de todos modos –

Respuesta

18

Está bien como está. La segunda condición no se comprobará si HasValue es falso, por lo que no arrojará una excepción. Es como si este tipo de cosas:

string name = ...; 
if (name != null && name.Length > 5) 

Una vez más, eso está bien - no se obtiene una NullReferenceException si name es nulo, porque & & es cortocircuitando.

Igual que el || el operador está en cortocircuito, pero en el sentido inverso - allí, si el operando de la izquierda es verdadero, la expresión general se evalúa como verdadera sin verificar el operando de la derecha. Por ejemplo:

// Treat null as if it were an empty string 
if (name == null || name.Length == 0) 

EDIT: Como se señaló en los comentarios, esto sólo se aplica a & & y || - no se aplica a & y |, que siempre evalúan ambos operandos.

+1

OMG - Jon Skeet respondió mi pregunta y dijo que mi código está bien ... ¡este día es épico! :) Con toda seriedad, gracias. –

+1

¿Sabes que, por más omnisciente que parezca, no es realmente un dios? –

+2

BLASPHEMY! * SCNR * – Bobby

0

puede simplemente hacer esto:

if(boolIsAllowed.GetValueOrDefault(false)) 
{ 

} 

Pero su código original no sería una excepción, ya que si no pasa la primera prueba, a continuación, toda la prueba literas porque & & es 'y también', por lo si la primera prueba es falsa, no hay forma de que la prueba tenga éxito.

6

¿Qué hay de:

if (boolIsAllowed ?? false) 
{ 
} 
0

El segundo operando sólo se evalúa si el primer operando se evalúa como verdadera. No es necesario anidar las declaraciones if.

8

Puede comprobar si el valor verdadero incluso si es nulo:

bool? val = null; 
if(val == true) // Works 
{ 
    //do something 
} 
+0

Bueno, pero uno debe asegurarse de comprender los [detalles] (http://stackoverflow.com/questions/447408/why-do-nullable-bools-not-allow-ifnullable-but-do-allow- ifnullable-true). –

0

Estás seguro haciendo eso. C# expresiones booleanas cortocircuitos, es por eso:

if (! = Null lista & & list.Count> 0)

Works. El código no se molestará en tratar de evaluar la segunda condición porque sabe que no puede ser cierta ya que el primer resultado fue falso.

No todos los idiomas hacen esto, muchos sí. En VB.NET tiene que hacerlo explícitamente con OrElse y AndAlso.

1

En general, si tiene varias condiciones en su sentencia if, considere la posibilidad de extraerlas en un método. Esto no es realmente necesario en esta instancia específica ya que algunas de las otras respuestas han demostrado. Pero puede ser mucho más simple en casos más complejos. ¿Prefiere mantener:

if (taxApplied && taxValue > minimumTax && customerIsPreferred) 
{ 
    // Do something 
} 

o

if (CustomerGetsTaxRebate()) 
{ 
    // Do Something 
} 
Cuestiones relacionadas