繁体   English   中英

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

[英]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,它会将nullfalse映射为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM