Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查三个布尔值之一是否为真的简单方法_C#_.net_Boolean - Fatal编程技术网

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个是真的吗?不,我同意评估其中一个或多个是真的。那么你已经在用正确的方式做了。