布尔变量本身翻转

本文关键字:翻转 变量 布尔 | 更新日期: 2023-09-27 18:20:20

我正在做。。

item.IsEnabled = !item.IsEnabled;

有没有一种不那么冗长的方法,例如

someInteger++;

想象一下:

thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue = !thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue

布尔变量本身翻转

item.IsEnabled ^= true;

^=是异或(XOR)运算符。由于true^true==falsefalse^true==true,以上具有反转的效果。)

在只使用一次变量名的情况下翻转布尔值的唯一方法是(如Jacob Krall所示):

 myBool ^= true; // flip the value

这是否可读是有争议的,但大多数人似乎认为这是而不是。(读写能力可能会略有提高,如上面的小评论。)

其他变体包括:

myBool = !myBool; // preferred, in my opinion

myBool = myBool == false;

关于多线程的补充说明:值得注意的是,在类似a.B的属性访问的情况下,只有^= true不受多线程问题的影响,因为a的值可能在分配过程中发生变化(尽管可能性不大)。

从生成的IL来看,上述版本之间的唯一区别是,编译器在后两个版本中两次加载a的值。但是,前者只加载一次,然后将值复制到评估堆栈中。因此,保证将属性值设置到读取值的同一对象上。另一方面,其他人可能从一个对象读取值,并将翻转的值设置到另一个对象上(在这些不太可能的情况下)。