C# 检查三个布尔值之一是否为真的简单方法
我尝试使用以下代码,但据我所知,它只检查前两个变量C# 检查三个布尔值之一是否为真的简单方法,c#,.net,boolean,C#,.net,Boolean,我尝试使用以下代码,但据我所知,它只检查前两个变量 if (var1 || var2 || var3) { // Do something. } 如果您需要评估这三种情况,可以使用: if (var1 | var2 | var3) { // Do something. } 相反。有这样的需求似乎很奇怪,但假设这三种属性的getter都有副作用 使用的方法可以是: if (DoWork() | DoDuties() | DoFinalStuff()) { // At l
if (var1 || var2 || var3)
{
// Do something.
}
如果您需要评估这三种情况,可以使用:
if (var1 | var2 | var3)
{
// Do something.
}
相反。有这样的需求似乎很奇怪,但假设这三种属性的getter都有副作用
使用的方法可以是:
if (DoWork() | DoDuties() | DoFinalStuff())
{
// At least one method returned true ("success")
}
在任何情况下都会调用这三个方法。您的代码正确地检查了三个变量中的一个是否为true,即
var1 || var2 || var3
如果var1、var2和var3中的任何一个为真,则为真。这里唯一的微妙之处是,实际检查是使用短路逻辑执行的:如果var1为真,则不必检查var2和var3等。我觉得其他答案已经涵盖了您需要做的事情,但我想对发生的事情给出更好的解释
|
或&
运算符是所谓的“短路”运算符,如果找到满足其需要的条件,它将停止检查其他元素(为|
找到的第一个true
或为&
找到的第一个false
)
所以实际上
if(var1 || var2 || var3)
SomeAction();
和做同样的事
if(var1)
SomeAction();
else if(var2)
SomeAction();
else if(var3)
SomeAction();
如果只使用|
而不是|
,它将在返回结果之前计算所有成员,类似于此
bool combined = var1;
combined = var2 **OR'ed with** combined;
combined = var3 **OR'ed with** combined;
if(combined)
SomeAction();
短路的一个非常有用的实际用途是在调用成员或方法之前检查null。在下面的示例中,假设var1是一个可以为null的变量,当var1.DataAvailable()
为true时,需要执行一个操作。比如说
if(var1 != null && var1.DataAvailable())
{
//do somthing with var1 when data is available
}
与
if(var1 != null)
{
if(var1.DataAvailable())
{
//do somthing with var1 when data is available
}
}
由于短循环,您将永远不会得到
nullreferenceexception
,因为var1.DataAvailable()
如果var1
为null
无人提及,则不会执行:
|
-二进制或| |
-逻辑或
让我们假设a=false
b=true
c=false
a|b|c
=true
a | b | c
=0 | 1 | 0
=1
也有逻辑“true”值。我可以告诉它只检查前两个变量
,如果其中一个为true,则无需检查第三个(在您的情况下第二个为true):)不。它首先检查var1是否为true,如果不是,则检查var2是否为true,如果没有,则检查var3。这就是所谓的短路,这正是你在问题标题中想要的。OP,你的意思是你只想让这个陈述在三个陈述中只有一个是真的,而不是2或3个是真的吗?不,我同意评估其中一个或多个是真的。那么你已经在用正确的方式做了。