在我寻找帮助解决问题时,我遇到了这个问题:
p.Enabled = p.Enabled != true;
这究竟是什么意思?我以前从未见过它,
nb:前一行是var p = this.PageRepository.GetPage(id);
答案 0 :(得分:33)
当p.Enabled
为正常bool
时,启用属性通常为
p.Enabled = p.Enabled != true;
与
相同p.Enabled = ! p.Enabled;
换句话说,它翻转或翻转p.Enabled
。
现在,当“已启用”是bool?
时,Nullable<bool>
的简写,结果不同:
! ((bool?) null) -> null
((bool?) null) != true -> true
因此p.Enabled = p.Enabled != true
会在旧值为true
或false
时设置null
。
答案 1 :(得分:32)
这是一个笨拙的bool拨动开关。每次调用都会将状态从true切换为false。我已写完了:
p.Enabled = !p.Enabled;
编辑 - 我想我应该说,只是在我看来写得很尴尬。
答案 2 :(得分:19)
这么多答案......我只是想把它分解一下:
p.Enabled = p.Enabled != true;
在语义上等同于:
var IN = p.Enabled;
var OUT = IN != true;
p.Enabled = OUT;
所以:
p.Enabled -> IN IN != true OUT -> p.Enabled
--------------- ------------- ----------------
true true != true false
false false != true true
(if nullable) null null != true true
因此,从Truth Table可以看出它与logical not (!
) operator相同*并且可以重写为:
p.Enabled = !p.Enabled;
(我认为大多数[有经验的]程序员更喜欢后一种形式,因为它是一种相当常见的习语。)
快乐的编码。
*请注意,在null
(又名bool?
)类型的情况下,将Nullable<bool>
添加为第三个输入状态。 (谢谢,托马斯梅菲尔德; - )
答案 3 :(得分:10)
与p.Enabled = !p.Enabled;
相同,与p.Enabled
相反。
答案 4 :(得分:9)
评估测试p.Enabled != true
。结果(布尔值)被分配给p.Enabled
。因此,如果p.Enabled
为真,则p.Enabled
将设置为false。另一种说法是p.Enabled = !p.Enabled
。也就是说,它基本上颠倒了p.Enabled
的价值。
答案 5 :(得分:8)
如果p.Enabled
是普通bool
,则它等同于p.Enabled = !p.Enabled
。即它切换p.Enabled
。
但如果p.Enabled
是可以为空的bool,它会将null
和false
映射到true
,并将true
映射到false
。但在这种情况下,我更愿意写p.Enabled = !(p.Enabled ?? true)
。
如果p.Enabled
是具有重载隐式转换运算符的自定义类型,则可能发生任何事情。
答案 6 :(得分:4)
基本上这会翻转p.Enabled的值。因此,如果它为真,那么p.Enabled != true
的计算结果为false,然后将该假值分配给p.Enabled = false
。如果p.Enabled是假的,它会反过来工作。
如果它是这样编写的话可能更有意义:
p.Enabled = !(p.Enabled);
答案 7 :(得分:3)
这样想:
p.Enabled = (p.Enabled != true);
现在,(p.Enabled != true)
评估为bool
,然后可以将其分配给另一个bool
变量。
答案 8 :(得分:3)
该行评估p.Enabled != true
,如果p.Enabled为真,则为false
;如果p.Enabled为false,则为true
。换句话说,一种非常尴尬的写作方式
p.Enabled = !p.Enabled
答案 9 :(得分:1)
使用此功能:
bool cond = (p.Enabled != true);
if (cond == true)
{
p.Enabled = cond; // = true
}
else
{
p.Enabled = cond; // = false
}