2010-09-10 26 views
10
bool foo = true; 

// Do this? 
if (foo) 
{ 
} 

// Or this? 
if (foo == true) 
{ 
} 

Me gusta uno de ellos y mi compañero de trabajo el otro. El resultado es el mismo, pero ¿qué es (más) correcto?Comprobar si boolean es verdadero

+0

Es una cuestión de estilo. Dudo que obtendrás una respuesta definitiva en este caso. – Robaticus

+0

Ojalá pudiera votar para cerrar como duplicado general. Hay demasiadas preguntas sobre esto y todas son igualmente subjetivas. – BoltClock

+11

A Jon Skeet le gusta el primero. Por lo tanto, es la forma correcta ... ¡fin de la discusión! ;-) –

Respuesta

33

Casi todo el mundo que he visto expresar una opinión prefiere

if (foo) 
{ 
} 

De hecho, he visto a muchas personas critican la comparación explícita, y puede que incluso lo he hecho a mí mismo antes de ahora. Yo diría que el estilo "corto" es idiomático.

EDIT:

Tenga en cuenta que esto no significa que la línea de código es siempre incorrecto. Considere:

bool? maybeFoo = GetSomeNullableBooleanValue(); 
if (maybeFoo == true) 
{ 
    ... 
} 

que recopilará, pero sin el "== true" no será así, ya que no hay conversión implícita de bool? a bool.

+3

De acuerdo. La única vez que usaría verbose (foo == verdadero) es si el nombre de la variable foo no es obviamente un booleano, solo por legibilidad. –

+0

+1 para el comentario 'bool?'. He estado usando '(maybeFoo.HasValue && maybeFoo.Value)' pero 'maybeFoo == true' es mucho mejor. – fredw

+1

@fredw: Otra opción es agregar el valor "predeterminado": 'if (maybeFoo ?? false)' or 'if (maybeFoo ?? true)'. Pero prefiero el '==' en general. –

23

Depende de su situación.

diría, si su bool tiene un buen nombre, entonces:

if (control.IsEnabled) // Read "If control is enabled." 
{ 
} 

sería preferible.

Sin embargo, si la variable tiene un nombre no tan obvio, la verificación en contra de true sería útil para comprender la lógica.

if (first == true) // Read "If first is true." 
{ 
} 
+10

La legibilidad de +1 debe guiar la respuesta; idealmente, cambiaría el nombre de la variable para que pueda usar la anterior. – RedFilter

+23

Si el nombre no es obvio, quizás debería cambiarse de nombre ... –

+0

Cuando se trata de sistemas integrados, a menudo es necesario verificar el estado de un solo bit. En C#, es perfectamente razonable almacenar el bit como booleano. En ese caso, verificar si boolean es verdadero puede proporcionar más legibilidad que renombrar la variable. Por ejemplo, considere un bit que indica si los datos deben ser una entrada o salida. Podría nombrar la variable 'IsOutputBit', pero tal vez sea más legible denominar' IODirection'. Lo admito, puede ser incluso mejor crear una enumeración de 2 valores para estos propósitos. –

3

El primer ejemplo casi siempre gana en mi libro:

if(foo) 
{ 
} 

Es más corto y conciso. ¿Por qué agregar un cheque adicional a algo cuando no es absolutamente necesario? Sólo estoy desperdiciando ciclos ...

Estoy de acuerdo, sin embargo, en que la sintaxis más prolija hace que las cosas sean más legibles (lo que es más importante siempre que el rendimiento sea aceptable) en situaciones donde las variables tienen un nombre pobre.

2

Ambos son correctos.

Probablemente tenga algún estándar de codificación en su empresa, solo siga para completarlo. Si usted no tiene - usted debe :)

+4

Un estándar de codificación que legisla cosas como esta es un "olor organizacional" –

+2

Me molestan los estándares de codificación con este nivel de microgestión. – RedFilter

+1

@Steve Townsend: Por otro lado, diez estilos de codificación diferentes en un archivo son un "hedor (dis) organizativo" y difíciles de leer. – Piskvor

1

yo personalmente preferiría

if(true == foo) 
{ 
} 

no hay ninguna posibilidad para el ==/= escribe mal y me resulta más expresivo en términos de tipo de foo. Pero es una pregunta muy subjetiva.

+0

Pero esto es C# y 'if (foo = true)' generará un error de tiempo de compilación. – ChrisF

+3

@ChrisF: No, no lo hará. El resultado de "foo = true" sigue siendo un bool, por lo que está bien para la condición "si". Sin embargo, * does * genera una advertencia en el compilador de MS. –

+1

¿Por qué detenerse aquí cuando podría hacer "if (true == (true == (true == foo)))"? ¿No sería esto más expresivo? ;) – Henrik

0

Ninguno es "más correcto". Mi preferencia personal es por la forma más concisa, pero o bien está bien. Para mí, la vida es demasiado corta para siquiera pensar en discutir el descarte sobre cosas como esta.

11

si vas a optar por

if(foo == true) 

por qué no ir todo el camino y hacer

if(foo == true == true == true == true == true == true == true == true == true) 

¿Qué es la misma cosa.

No estoy de acuerdo con que si está claramente nombrado (es decir, IsSomething), entonces está bien que no se compare con verdadero, pero de lo contrario debería hacerlo. Si está en una declaración if, obviamente se puede comparar con verdadero.

if(monday) 

es tan descriptiva como

if(monday == true) 

también me quedo con la misma norma para no:

if(!monday) 

en contraposición a

if(monday == false)