我可以“反转”一个布尔值吗?

Posted

技术标签:

【中文标题】我可以“反转”一个布尔值吗?【英文标题】:Can I 'invert' a bool? 【发布时间】:2012-02-13 07:16:48 【问题描述】:

我有一些检查以查看屏幕是否处于活动状态。代码如下所示:

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的值?

(这是 Unity3D 中的 C#)

【问题讨论】:

即使没有更好的优化,您也可以从代码中删除所有== true 如果有像++-- 运算符这样的运算符来做这件事会很酷。 【参考方案1】:

您可以通过否定布尔值来摆脱 if/else 语句:

ruleScreenActive = !ruleScreenActive;

【讨论】:

我总是使用异或赋值运算符:x ^= true;。在大多数情况下更漂亮(在我看来)更短,但效果相同。 @Tobias 有趣的方法。更短的是,但可读性值得商榷。如果我在代码中看到这一点,它会让我比典型的否定要长一秒钟。 我认为在这种情况下重复自己会导致更好的易读性并且值得权衡。 对 VB 新手来说只是一个仅供参考:这在 VB.Net 中也可以通过做完全相同的事情来工作:rulesScreenActive = Not (ruleScreenActive) @jack DRY 不是你可以在任何地方应用的东西。例如,当我在每个表达式的末尾加上分号时,你不能把它干掉。【参考方案2】:

我觉得最好写:

ruleScreenActive ^= true;

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

【讨论】:

语法 csharp 应该有:ruleScreenActive!!; +1!这正是我一直在寻找的。这使得基于另一个 bool ("abcd".Contains("s") ^= someNegateBool) 翻转 bool 变得更加容易 很好的答案,因为您可以使用变量来更改布尔值! 稍微解释一下操作符会更好。 说明:^ 是 XOR 条件运算符,它就像一个普通的 OR,除非两者都是 true,它返回 false 而不是 true,这意味着你只会得到这两种情况:0^1=1和 1^1=0 确实反转了布尔值(第一位)。我喜欢这种方法,因为如果您在 bool 变量上执行 Find All References,则该行将仅显示一次(就像 bool++ 一样),而使用另一种方法,它将背靠背显示 2 次,这很烦人。一旦你真正理解了它的含义,阅读起来并不难。【参考方案3】:
ruleScreenActive = !ruleScreenActive;

【讨论】:

【参考方案4】:

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

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

给予:

ruleScreenActive.Invert();

【讨论】:

这是可能的,但我不推荐它,因为它会带来两个问题:1. 不是您团队中的每个编码员都会知道(或记住)这种方法,因此您最终会遇到不一致的情况在某些地方使用它而在其他地方不使用它的代码,2. 在某些时候它会导致混乱,因为人们可能期望它会改变值而不是返回更改后的副本(C# 中常见的愚蠢错误之一是忘记 @ 987654323@ 返回一个值而不是修改它,即使人们知道 .NET 中的字符串是不可变的)。将其命名为 Invert 而不是 Inverted 更有可能。 是的,我知道已经有一段时间了:) @Jack 这个名字 Toggle 恕我直言听起来更好 哈哈,@karlingen 看看 Konrad,也许你的意思是 Toggled 这实际上应该是ruleScreenActive = ruleScreenActive.Invert(); 只是ruleScreenActive.Invert(); 将通过结果。

以上是关于我可以“反转”一个布尔值吗?的主要内容,如果未能解决你的问题,请参考以下文章

js中数字是非布尔值吗

编译器会优化模板布尔值吗?

贝叶斯网络中的变量必须是布尔值吗?

“IsFalse”和“IsTrue”基本上只是隐式转换为布尔值吗?

当单击反转排序顺序的列标题时存储一个布尔值

替代 MySQL 中的大量布尔值?