[英]in C# what does 'bool = bool != true' mean?
在我寻找一些问题的帮助时,我遇到了这个:
p.Enabled = p.Enabled != true;
这到底是什么意思? 我以前从未见过它,
nb:前一行是var p = this.PageRepository.GetPage(id);
当p.Enabled
是普通bool
,通常是Enabled属性,
p.Enabled = p.Enabled != true;
是相同的
p.Enabled = ! p.Enabled;
换句话说:它翻转或翻转p.Enabled
。
现在当Enabled是一个bool?
, Nullable<bool>
简写,结果不同:
! ((bool?) null) -> null
((bool?) null) != true -> true
所以当旧值为false
或为null
时, p.Enabled = p.Enabled != true
将设置为true
。
这是一个笨拙的bool切换开关。 每次调用都会将状态从true切换为false。 我写过:
p.Enabled = !p.Enabled;
编辑 - 我想我应该说,在我看来只是笨拙的写作。
这么多答案......我只是想把它分解一点:
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
因此,从真值表中可以看出它与逻辑非( !
)运算符相同*并且可以重写为:
p.Enabled = !p.Enabled;
(我想大多数[有经验的]程序员更喜欢后一种形式,因为它是一种相当常见的习语。)
快乐的编码。
*注意在bool?
情况下添加null
作为第三个输入状态bool?
(又名Nullable<bool>
)类型。 (谢谢,托马斯梅菲尔德;-)
它与p.Enabled = !p.Enabled;
相同p.Enabled = !p.Enabled;
,与p.Enabled
相反。
测试p.Enabled != true
的测试。 其结果(布尔值)分配给p.Enabled
。 因此,如果p.Enabled
为true,则p.Enabled
将设置为false。 另一种说法是p.Enabled = !p.Enabled
。 也就是说,它基本上反转了p.Enabled
的值。
如果p.Enabled
是一个普通的bool
它相当于p.Enabled = !p.Enabled
。 即它切换p.Enabled
。
但是如果p.Enabled
是一个可以为空的bool,它会将null
和false
映射为true
,并将true
映射为false
。 但在这种情况下,我更喜欢写p.Enabled = !(p.Enabled ?? true)
。
如果p.Enabled
是具有重载隐式转换运算符的自定义类型,则可能发生任何事情。
从本质上讲,这将翻转p.Enabled的值。 因此,如果它为真,那么p.Enabled != true
计算结果为false,然后将该false值赋值给p.Enabled = false
。 如果p.Enabled是假的,它会反过来工作。
如果它是这样编写的话可能更有意义:
p.Enabled = !(p.Enabled);
想一想:
p.Enabled = (p.Enabled != true);
现在, (p.Enabled != true)
计算为bool
,然后可以将其分配给另一个bool
变量。
该行评估p.Enabled != true
,这是false
,如果p.Enabled是真实的, true
,如果p.Enabled是假的。 换句话说,一种非常尴尬的写作方式
p.Enabled = !p.Enabled
使用此功能:
bool cond = (p.Enabled != true);
if (cond == true)
{
p.Enabled = cond; // = true
}
else
{
p.Enabled = cond; // = false
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.