2012-01-18 9 views
36

Ho alcuni controlli per vedere se uno schermo è attivo. Il codice è simile al seguente:Posso "invertire" 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; 
    } 

Esiste un modo per - ogni volta che clicco il bottone - invertire il valore di ruleScreenActive?

(questo è C# in Unity3D)

+15

Cosa c'è di sbagliato con 'ruleScreenActive = ruleScreenActive'? – ChrisF

+3

@ChrisF Ad essere onesti, non sapevo che esistesse, non ho ancora molta esperienza e conoscenza. –

+6

Questa sarà una di quelle domande con 100 ingrandimenti, 100k visualizzazioni. – Groo

risposta

86

si può sbarazzarsi dei vostri if/else negando il valore del bool:

ruleScreenActive = !ruleScreenActive; 
+4

Uso sempre l'operatore esclusivo o di assegnazione: 'x^= true;'. È più carina (secondo me) e più corta nella maggior parte dei casi, ma fa lo stesso. – Nuffin

+12

@Tobias approccio interessante. Più corto sì, ma la leggibilità è discutibile. Se l'avessi visto in codice mi avrebbe fatto pensare a una frazione di secondo più lunga della tipica negazione. –

+2

-1 DRY non ripeti te stesso – Jack

22

penso che sia meglio scrivere:

ruleScreenActive ^= true; 

in questo modo si evita di scrivere il nome della variabile due volte ... che può causare errori

+13

-1 per la leggibilità. – Phill

+8

la sintassi csharp dovrebbe avere: ruleScreenActive !!; – Jack

+1

+1! Questo e 'esattamente quello che stavo cercando. Questo rende molto più semplice capovolgere un bool basato su un altro bool ("abcd" .Contains ("s")^= someNegateBool) – Trafz

9

questo sarebbe inline, così aumenta la leggibilità, i costi di esecuzione rimane lo stesso:

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

Per dare:

ruleScreenActive.Invert(); 
+1

È possibile, ma non lo consiglio perché introduce due problemi: 1. non tutti i codificatori della tua squadra sapranno (o ricorderanno) di questo metodo, quindi finirai con codice incoerente dove è usato in alcuni posti e in alcuni altri no, 2. a un certo punto causerà confusione poiché ci si potrebbe aspettare che muti il ​​valore piuttosto che restituire una copia alterata (uno dei comuni errori stupidi in C# è dimenticare che 'String.Replace' restituisce un valore piuttosto che modificarlo, anche se le persone sanno che le stringhe in .NET sono immutabili). Chiamandolo "Inverti" invece di "Invertito" lo rende ancora più probabile. –

+0

E sì, lo so che è passato un po 'di tempo:) –

+0

@Jack il nome 'Toggle' suona meglio IMHO – karlingen