2012-01-18 6 views
36

私は画面がアクティブかどうかを確認するいくつかのチェックがあります。コードは次のようになります。ブールを逆転できますか?

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; 
    } 

にどんな方法がある - 私はボタンをクリックしたときに - ruleScreenActiveの値を反転しますか?私はそれを書くために、より良いと思い

ruleScreenActive = !ruleScreenActive; 
+15

を 'ruleScreenActive =と間違って何ruleScreenActive'!? – ChrisF

+3

@ChrisF正直言って、私はそれが存在するかどうかは分かりませんでしたが、まだ多くの経験と知識を持っていませんでした。 –

+6

これは、100倍のupvoted、100kビューの質問の1つになるでしょう。 – Groo

答えて

86

あなたがブールの値を否定することで、あなたのif/else文を取り除くことができます(これはUnity3DでC#の場合)

ruleScreenActive ^= true; 

このように、変数名を2回書くのは避けてください...エラーにつながる可能性があります

+4

私は常に排他的または代入演算子を使います: 'x^= true;'。私の意見ではもっときれいで、ほとんどの場合はもっと短いですが、それは同じです。 – Nuffin

+12

@Tobias興味深いアプローチ。はい、しかし可読性は議論の余地があります。私がコードでそれを見た場合、それは私に典型的な否定よりも2分の1の時間を考えるようになります。 –

+2

-1 DRYは自分自身を繰り返さないでください – Jack

22

+13

-1 – Phill

+8

構文csharpは次のようになります:ruleScreenActive !!; – Jack

+1

+1!これはまさに私が探していたものです。これにより、別のbool( "abcd" .Contains( "s")^ = someNegateBool)に基づいてboolをフリップするのがはるかに簡単になります。 – Trafz

9

これは、インライン化するので、可読性が増加し、ランタイムコストは同じままになります:

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

与えるために:

ruleScreenActive.Invert(); 
+1

それは可能ですが、2つの問題を紹介しているので、私はそれを推奨しません:1.あなたのチームのすべてのコーダーがこの方法について知っている(または覚えている)わけではないので、 2.ある時点では、変更されたコピーを返すのではなく、値を変更することが期待できるため、混乱を招くことがあります(C#の一般的な愚かな間違いの1つは、 'String.Replace'が値人々は.NETの文字列が不変であることを知っているにもかかわらず、それを変更するのではなく)。それを「Inverted」の代わりに「Invert」と命名すると、それはさらに可能性が高くなります。 –

+0

そして、はい、私はそれがしばらくしていることを知っています:) –

+0

@ジャックはトグルの名前が良く聞こえますIMHO – karlingen

関連する問題