2012-01-18 15 views
36

Tengo algunas verificaciones para ver si una pantalla está activa. El código es el siguiente:¿Puedo 'invertir' un bool?

if (GUI.Button(new Rect(Screen.width/2 - 10, 50, 50, 30), "Rules")) //Creates a button 
    { 
     if (ruleScreenActive == true) //check if the screen is already active 
      ruleScreenActive = false; //handle according to that 
     else 
      ruleScreenActive = true; 
    } 

¿Hay alguna manera de - cada vez que haga clic en el botón - invertir el valor de ruleScreenActive?

(Esto es C# en Unity3D)

+15

Qué le pasa a 'ruleScreenActive = ruleScreenActive'? – ChrisF

+3

@ChrisF Para ser sincero, no sabía que existía, aún no tengo mucha experiencia y conocimiento. –

+6

Esta va a ser una de esas preguntas con 100x de votos arriba, 100k de visitas. – Groo

Respuesta

86

Usted puede deshacerse de sus instrucciones if/else negando el valor de la bool:

ruleScreenActive = !ruleScreenActive; 
+4

Siempre uso el operador exclusivo o de asignación: 'x^= true;'. Es más bonito (en mi opinión) y más corto en la mayoría de los casos, pero hace lo mismo. – Nuffin

+12

@Tobias enfoque interesante. Más corto sí, pero la legibilidad es discutible. Si lo veo en el código, me haría pensar una fracción de segundo más que la típica negación. –

+2

-1 SECO no se repita – Jack

22

Creo que es mejor escribir:

ruleScreenActive ^= true; 

de esta manera usted evita escribir el nombre de la variable dos veces ... lo que puede conducir a errores

+13

-1 para la legibilidad. – Phill

+8

la sintaxis csharp debería tener: ruleScreenActive !!; – Jack

+1

+1! Esto es exactamente lo que estaba buscando. Esto hace que sea mucho más fácil voltear un bool basado en otro bool ("abcd" .Contains ("s")^= someNegateBool) – Trafz

9

esto sería entre líneas, por lo que aumenta la legibilidad, los costos de tiempo de ejecución sigue siendo el mismo:

public static bool Invert(this bool val) { return !val; } 

para dar:!

ruleScreenActive.Invert(); 
+1

Es posible, pero no lo recomendaría ya que presenta dos problemas: 1. No todos los programadores de tu equipo sabrán (o recordarán) sobre este método, por lo que terminarás con un código inconsistente donde se usa en algunos lugares y en otros no, 2. en algún punto generará confusión ya que se podría esperar que mute el valor en lugar de devolver una copia alterada (uno de los errores más comunes en C# es olvidar que 'String.Replace' devuelve un valor en lugar de modificarlo, aunque las personas saben que las cadenas en .NET son inmutables). Nombrarlo como 'Invertir' en lugar de 'Invertir' lo hace aún más probable. –

+0

Y sí sé que ha pasado un tiempo:) –

+0

@Jack el nombre 'Toggle' suena mejor IMHO – karlingen