MonoDevelop建议将if语句转换为按位运算

fox*_*eSs 8 c# boolean-logic bitwise-operators monodevelop

MonoDevelop建议转向:

if (someBoolVar)
    anotherBoolVar = true;
Run Code Online (Sandbox Code Playgroud)

进入这个:

anotherBoolVar |= someBoolVar;
Run Code Online (Sandbox Code Playgroud)

它也做它,当我设置anotherBoolVarfalse代替:

if (someBoolVar)
    anotherBoolVar = false;
Run Code Online (Sandbox Code Playgroud)

变为:

anotherBoolVar &= !someBoolVar;
Run Code Online (Sandbox Code Playgroud)

有人可以解释这些陈述是如何平等的吗?

ang*_*son 12

好吧,功能上他们是等同的.

在第一种情况下,你要设置anotherBoolVartrue如果someBoolVartrue,不管什么样的价值anotherBoolVar目前,替换表达式做到这一点.

这是短暂的:

anotherBoolVar = anotherBoolVar | someBoolVar;
Run Code Online (Sandbox Code Playgroud)

第二个替换也与它替换的代码相同,并且简称:

anotherBoolVar = anotherBoolVar & (!someBoolVar);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,解决方案隐藏在布尔变量的"按位"性质中.对于使用反转值(~反转someBoolVar)将有效地说"保留所有设置的位!someBoolVar并清除其余的",这意味着如果someBoolVar为真,它将被反转为假,并且您将有效地清除anotherBoolVar.


现在,你应该这样做吗?

在我看来,没有.代码更具可读性.保持,甚至可能寻找一种方法让MonoDevelop不再建议这些东西.

  • 似乎MonoDevelop正在假设一个_dumb_编译器.任何_decent_编译器都会优化(甚至在`-O0`)`if`语句为`OR`或`AND`指令以避免"比较和跳转".从好的方面来看,[MonoDevelop是开源的](https://github.com/mono/monodevelop),所以如果你有一个GitHub帐户,你可以提交一个bug(问题)请求(@ LasseV.Karlsen,你应该提一下在你的最后一段) (2认同)