我正在做..
item.IsEnabled = !item.IsEnabled;
是否有一种不那么冗长的方式,例如。
someInteger++;
想象
thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue = !thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue
答案 0 :(得分:2)
item.IsEnabled ^= true;
(^=
是独占或(XOR)运算符。自true^true==false
和false^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
两次的值。但是,前者仅加载一次,然后将值复制到评估堆栈上。因此,保证将属性值设置为从其读取值的同一对象。另一方面,其他人可能从一个对象读取值并将翻转的值设置到另一个对象上(在这些不太可能的情况下)。