布尔变量自身翻转

时间:2014-09-01 04:43:59

标签: c#

我正在做..

item.IsEnabled = !item.IsEnabled;

是否有一种不那么冗长的方式,例如。

someInteger++;

想象

thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue = !thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue

2 个答案:

答案 0 :(得分:2)

item.IsEnabled ^= true;

^=是独占或(XOR)运算符。自true^true==falsefalse^true==true以来,上述情况具有反转效果。)

答案 1 :(得分:2)

仅使用变量名称时翻转布尔值的唯一方法是(如Jacob Krall所示):

 myBool ^= true; // flip the value

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

其他变体包括:

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

myBool = myBool == false;

关于多线程的附注:值得注意的是,在a.B之类的属性访问的情况下,只有^= true才能免于多线程线程问题a的值可能在赋值中间发生变化(但不太可能)。

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