在C#中,'bool = bool!= true'是什么意思?

Len*_*lly 17 c# boolean-logic

在我寻找一些问题的帮助时,我遇到了这个:

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

  • 仅当设置了"p.Enabled"时才为真.如果`p.Enabled = null`,您的代码将无法工作. (2认同)
  • 这并不是说这个答案不正确或表达不应该重构 (2认同)

asa*_*yer 32

这是一个笨拙的bool切换开关.每次调用都会将状态从true切换为false.我写过:

p.Enabled = !p.Enabled;
Run Code Online (Sandbox Code Playgroud)

编辑 - 我想我应该说,在我看来只是笨拙的写作.

  • 别担心,它*写得很笨拙. (21认同)
  • 我认为笨拙的写作是轻描淡写的.这是一个完美的例子,为了让自己变得聪明或不知道什么是否定,增加了复杂性.无论哪种方式都是坏迹象. (5认同)

小智 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>


jru*_*ell 10

它是相同的p.Enabled = !p.Enabled;,相反的p.Enabled.


sir*_*ide 9

p.Enabled != true评估测试.它的结果(这是一个布尔值)被赋值给p.Enabled.所以如果p.Enabled是,那么p.Enabled将被设置为false.另一种说法是p.Enabled = !p.Enabled.也就是说,它基本上反转了它的价值p.Enabled.


Cod*_*aos 8

如果p.Enabled是一个普通的,bool它相当于p.Enabled = !p.Enabled.即它切换p.Enabled.

但是,如果p.Enabled是一个可空布尔值,它会映射nullfalsetrue,并映射truefalse.但我更喜欢写p.Enabled = !(p.Enabled ?? true)那种情况.

如果p.Enabled是具有重载隐式转换运算符的自定义类型,则可能发生任何事情.