在我寻找一些问题的帮助时,我遇到了这个:
p.Enabled = p.Enabled != true;
Run Code Online (Sandbox Code Playgroud)
这到底是什么意思?我以前从未见过它,
nb:前一行是 var p = this.PageRepository.GetPage(id);
Hen*_*man 33
什么时候p.Enabled是正常的bool,通常是Enabled属性,
p.Enabled = p.Enabled != true;
Run Code Online (Sandbox Code Playgroud)
是相同的
p.Enabled = ! p.Enabled;
Run Code Online (Sandbox Code Playgroud)
换句话说:它翻转或翻转p.Enabled.
现在,当Enabled是a bool?,简写为Nullable<bool>,结果是不同的:
! ((bool?) null) -> null
((bool?) null) != true -> true
Run Code Online (Sandbox Code Playgroud)
因此,当旧值为或时,p.Enabled = p.Enabled != true将设置.truefalsenull
asa*_*yer 32
这是一个笨拙的bool切换开关.每次调用都会将状态从true切换为false.我写过:
p.Enabled = !p.Enabled;
Run Code Online (Sandbox Code Playgroud)
编辑 - 我想我应该说,在我看来只是笨拙的写作.
小智 19
这么多答案......我只是想把它分解一点:
p.Enabled = p.Enabled != true;
Run Code Online (Sandbox Code Playgroud)
在语义上等同于:
var IN = p.Enabled;
var OUT = IN != true;
p.Enabled = OUT;
Run Code Online (Sandbox Code Playgroud)
所以:
p.Enabled -> IN IN != true OUT -> p.Enabled
--------------- ------------- ----------------
true true != true false
false false != true true
(if nullable) null null != true true
Run Code Online (Sandbox Code Playgroud)
因此,从真值表中可以看出它与逻辑not(!)运算符相同*并且可以重写为:
p.Enabled = !p.Enabled;
Run Code Online (Sandbox Code Playgroud)
(我想大多数[有经验的]程序员更喜欢后一种形式,因为它是一种相当常见的习语.)
快乐的编码.
*注意在(又名)类型的情况下添加null为第三输入状态.(谢谢,托马斯梅菲尔德;-)bool?Nullable<bool>
p.Enabled != true评估测试.它的结果(这是一个布尔值)被赋值给p.Enabled.所以如果p.Enabled是,那么p.Enabled将被设置为false.另一种说法是p.Enabled = !p.Enabled.也就是说,它基本上反转了它的价值p.Enabled.
如果p.Enabled是一个普通的,bool它相当于p.Enabled = !p.Enabled.即它切换p.Enabled.
但是,如果p.Enabled是一个可空布尔值,它会映射null和false对true,并映射true到false.但我更喜欢写p.Enabled = !(p.Enabled ?? true)那种情况.
如果p.Enabled是具有重载隐式转换运算符的自定义类型,则可能发生任何事情.
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |