我能倒"一个布尔吗?

Sim*_*eke 48 c# boolean

我有一些检查,看看屏幕是否有效.代码如下所示:

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;
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法 - 每当我点击按钮 - 反转的值ruleScreenActive

(这是Unity3D中的C#)

Ahm*_*eed 119

你可以通过否定bool的值来摆脱你的if/else语句:

ruleScreenActive = !ruleScreenActive;
Run Code Online (Sandbox Code Playgroud)

  • @Tobias有趣的方法.更短的是,但可读性值得商榷.如果我在代码中看到它会使我认为比典型的否定更长时间. (22认同)
  • 我认为在这种情况下重复自己会带来更好的易读性,值得权衡. (12认同)
  • 我总是使用exclusive或赋值运算符:`x ^ = true;`.在大多数情况下更漂亮(在我看来)和更短,但也是如此. (9认同)
  • 只是对VB新手的一个FYI:这也可以在VB.Net中使用完全相同的东西:rulesScreenActive = Not(ruleScreenActive) (2认同)
  • @jack DRY不是可以在任何地方应用的东西。例如,当我将分号放在每个表达式的末尾时,就无法将其干燥。 (2认同)

Jac*_*ack 33

我认为最好写:

ruleScreenActive ^= true;
Run Code Online (Sandbox Code Playgroud)

这样你就可以避免两次写变量名......这会导致错误

  • 语法csharp应该有:ruleScreenActive !!; (15认同)
  • +1!这正是我想要的。这使得基于另一个布尔值(“ abcd” .Contains(“ s”)^ = someNegateBool)的布尔值翻转变得容易得多。 (4认同)
  • 关于运营商的一些解释会更好。 (3认同)
  • 说明:^ 是 XOR 条件运算符,它就像一个普通的 OR,除非两者都为真,它返回假而不是真,这意味着你只能得到这两种情况: 0^1=1 和 1^1=0 这确实反转布尔值(第一位)。我喜欢这种方法,因为如果你在 bool 变量上执行 Find All References,这条线将只显示一次(就像 bool++),而使用另一种方法它会连续显示 2 次,这很烦人。一旦你真正理解了它的意思,阅读起来一点也不难。 (3认同)
  • 好的答案,因为您可以使用变量来更改布尔值! (2认同)
  • 如果您想通过将对象存储在额外变量中以仅翻转其中的 bool 变量来避免产生垃圾,这也是一个很好的解决方案。就像`parent.GetChild(0).GetRenderOptions().flipX ^= true;` (2认同)

Mus*_*sis 11

ruleScreenActive = !ruleScreenActive;
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 11

这将是内联的,因此可读性增加,运行时成本保持不变:

public static bool Invert(this bool val) { return !val; }
Run Code Online (Sandbox Code Playgroud)

给:

ruleScreenActive.Invert();
Run Code Online (Sandbox Code Playgroud)

  • 这是可能的,但我不推荐它,因为它引入了两个问题:1.并非你团队中的每个编码器都知道(或记住)这个方法,所以你最终会得到一些不一致的代码,它会在某些地方使用在某些其他方面没有,2.在某些时候它会导致混乱,因为人们可以期望它改变价值而不是返回一个改变的副本(C#中常见的愚蠢错误之一就是忘记`String.Replace`返回一个值而不是而不是修改它,即使人们知道.NET中的字符串是不可变的).将它命名为"Invert"而不是"Inverted"使它更有可能. (4认同)
  • 这实际上应该是 `ruleScreenActive = RuleScreenActive.Invert();` 只是 `ruleScreenActive.Invert();` 将遍历结果。 (4认同)
  • @Jack,“Toggle”这个名字听起来更好,恕我直言 (2认同)