2014-09-01 74 views
-1

我做..布尔变量翻转

item.IsEnabled = !item.IsEnabled; 

有没有一种更简洁的方式例如

someInteger++; 

想象:

thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue = !thisIsAnExceptionallyLongNamedVariable.IsSomeBooleanValue 
+3

不,没有。这就是说 - 你能提供更多的上下文吗? – 2014-09-01 04:45:46

+0

你为什么要这样做? – Pietu1998 2014-09-01 04:46:30

+0

如果我读了'IsEnabled',我会认为这是一个只读属性 - 为什么我会设置** IsEnabled或从外部切换它? – Carsten 2014-09-01 04:47:16

回答

2
item.IsEnabled ^= true; 

^=是异或(XOR)操作者由于true^true==falsefalse^true==true,上述具有反转的效果。)

2

翻转布尔值而仅使用变量名称的唯一方法是(雅各·克劳显示):

myBool ^= true; // flip the value 

无论是可读与否是值得商榷的,但大多数人认为它是。 (可读性可能与像上面一个小评论略有改善)

其它变体包括:

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

myBool = myBool == false; 

关于多线程旁注:值得注意的是,如果像a.B这样的财产访问,只有^= true免疫多重在作业中间a的值可能会改变的ading问题(但不太可能)。

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