布尔变量本身翻转
本文关键字:翻转 变量 布尔 | 更新日期: 2023-09-27 18:20:20
我正在做。。
item.IsEnabled = !item.IsEnabled;
有没有一种不那么冗长的方法,例如
someInteger++;
想象一下:
thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue = !thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue
item.IsEnabled ^= true;
(^=
是异或(XOR)运算符。由于true^true==false
和false^true==true
,以上具有反转的效果。)
在只使用一次变量名的情况下翻转布尔值的唯一方法是(如Jacob Krall所示):
myBool ^= true; // flip the value
这是否可读是有争议的,但大多数人似乎认为这是而不是。(读写能力可能会略有提高,如上面的小评论。)
其他变体包括:
myBool = !myBool; // preferred, in my opinion
和
myBool = myBool == false;
关于多线程的补充说明:值得注意的是,在类似a.B
的属性访问的情况下,只有^= true
不受多线程问题的影响,因为a
的值可能在分配过程中发生变化(尽管可能性不大)。
从生成的IL来看,上述版本之间的唯一区别是,编译器在后两个版本中两次加载a
的值。但是,前者只加载一次,然后将值复制到评估堆栈中。因此,保证将属性值设置到读取值的同一对象上。另一方面,其他人可能从一个对象读取值,并将翻转的值设置到另一个对象上(在这些不太可能的情况下)。