2012-03-06 15 views
17

En mi búsqueda de ayuda para un problema que tenía me encontré con esto:en C# ¿Qué significa 'bool = bool! = True'?

p.Enabled = p.Enabled != true; 

Lo que quiere decir esto exactamente? Nunca he visto antes,

NB: Línea de la precedente era var p = this.PageRepository.GetPage(id);

+5

Ha pasado un tiempo desde que escribí C#, pero parece que es el equivalente de 'p.Enabled =! P.Enabled;'. – JasonFruit

+0

p.Enabled = p.Enabled aquí es donde usted dice que p.Enabled tomará el valor de p.Enabled (que no tiene sentido). Entonces estás diciendo que no debería ser igual a tue; por lo tanto falso – Andrew

+0

Guau, diez respuestas duplicadas a esta pregunta (incluidas las dos respuestas de "comentario" anteriores). Me parece que algunas personas deberían estar borrando sus respuestas. –

Respuesta

32

Cuando p.Enabled es normal bool, como propiedades habilitadas por lo general son,

p.Enabled = p.Enabled != true; 

es lo mismo que

p.Enabled = ! p.Enabled; 

en otras palabras: voltea o alterna p.Enabled.

Ahora, cuando habilitado es un bool?, abreviatura de Nullable<bool>, los resultados son diferentes:

! ((bool?) null)   -> null 
((bool?) null) != true  -> true 

Así p.Enabled = p.Enabled != true fijará true cuando el valor anterior era false o null.

+2

Solo es verdadero si está configurado 'p.Enabled'. Su código no funcionará si 'p.Enabled = null'. – kba

+0

@KristianAntonsen - No sé esta clase de página pero, en general, las propiedades de IsEnabled no admiten nulos. –

+0

OK, no soy muy buen chico, así que probablemente tengas razón. – kba

10

Es lo mismo que p.Enabled = !p.Enabled;, lo contrario de p.Enabled.

31

Es un interruptor de palanca bool escrito torpemente. Cada llamada alterna el estado de verdadero a falso. Me he escrito:

p.Enabled = !p.Enabled; 

Editar - supongo que debería decir, torpemente escrita solamente en mi opinión.

+21

No se preocupe, * está * escrita torpemente. – zmbq

+5

Creo que escribir mal es una subestimación. Es un ejemplo perfecto de alguien que agrega complejidad por el hecho de sentirse inteligente o por no saber qué es la negación. De cualquier manera, mala señal. –

9

Se evalúa la prueba p.Enabled != true. El resultado de eso (que es un booleano) se asigna a p.Enabled. Por lo tanto, si p.Enabled es verdadero, entonces p.Enabled se establecerá en falso. Otra forma de decir esto es p.Enabled = !p.Enabled. Es decir, básicamente está invirtiendo el valor de p.Enabled.

3

creo que de esta manera:

p.Enabled = (p.Enabled != true); 

Ahora, (p.Enabled != true) evalúa a un bool, que luego se puede asignar a otra variable bool.

8

si p.Enabled es un simple bool es equivalente a p.Enabled = !p.Enabled. es decir, alterna p.Enabled.

Pero si p.Enabled es un bool anulable, se null mapa y false a true, y mapa true a false. Pero preferiría escribir p.Enabled = !(p.Enabled ?? true) en ese caso.

Si p.Enabled es un tipo personalizado con operadores de conversión implícita sobrecargados, podría pasar cualquier cosa.

4

Básicamente, esto cambiaría el valor de p.Enabled.Entonces, si fuera verdadero, entonces p.Enabled != true evalúa como falso, y luego ese falso valor se asigna a p.Enabled = false. Y funcionaría al revés si p.Enabled fuera falso.

Podría tener más sentido si hubiera sido escrito así:

p.Enabled = !(p.Enabled); 
3

La línea evalúa p.Enabled != true, que es false si p.Enabled es verdadera y si true p.Enabled es falsa. En otras palabras, de una manera muy incómoda de escribir

p.Enabled = !p.Enabled 
1

Utilice esta función:

bool cond = (p.Enabled != true); 
if (cond == true) 
{ 
    p.Enabled = cond; // = true 
} 
else 
{ 
    p.Enabled = cond; // = false 
} 
19

tantas respuestas ... Sólo quiero romper hacia abajo un poco más:

p.Enabled = p.Enabled != true; 

es semánticamente equivalente a:

var IN = p.Enabled; 
var OUT = IN != true; 
p.Enabled = OUT; 

Por lo tanto:

p.Enabled -> IN  IN != true  OUT -> p.Enabled 
---------------  ------------- ---------------- 
true    true != true false 
false    false != true true 
(if nullable) null null != true true 

Así, desde el Truth Table, se puede ver que es lo mismo * como el logical not (!) operator y se puede reescribir como:

p.Enabled = !p.Enabled; 

(me imagino que la mayoría [experiencia] los programadores prefieren esta última forma, ya que es una expresión bastante común.)

Happy coding.


* Tenga en cuenta la adición de null como el estado de entrada tercer en caso de bool? (aka) Nullable<bool> tipos. (Gracias, Thomas Mayfield ;-)