在 C# 中对布尔值使用 &=

Using &= on boolean values in C#

我在 C# 中有一个名为 SendEvent 的方法,其中 returns 一个 bool 表示它是否成功。我想循环遍历多个对象并对它们全部调用 SendEvent,最后,有一个结果变量是 bool,即 true 如果所有 SendEvent 调用成功,并且 false 如果至少有一个失败。

起初我是这样做的:

bool result = true;
for (int i = 0; i < myObjects.Length; i++)
{
    result = result && myObjects[i].SendEvent();
}

但这将导致如果一个对象失败,将不会在后续对象上调用 SendEvent,因为如果结果为 [=,则不会执行 && 运算符的右侧19=].

所以我把它转过来:

bool result = true;
for (int i = 0; i < myObjects.Length; i++)
{
    result = myObjects[i].SendEvent() && result;
}

但我觉得有点难看。我可以使用按位 &= 运算符始终执行 SendEvent 调用,并像这样设置结果的值吗?

bool result = true;
for (int i = 0; i < myObjects.Length; i++)
{
    result &= myObjects[i].SendEvent();
}

&= 如何处理布尔值?它会执行运算符的两边吗?结果变量中的结果是什么?

如您所见,here&&& 都为 bools 定义为“逻辑和”,但是&&短路:如果第一个操作数是false 右边的表达式不会被计算。不管右边表达式的结果是什么,&& 表达式的结果将保持 false。这通常首先是 "performance hack",但如果正确的表达式有 副作用 ,可能会引发异常等,这是您必须考虑的事情帐户。如果第一个操作数是 true.

|| 运算符也会发生同样的情况

所以如果你想先评估双方,你确实可以使用:

result = result & myObjects[i].SendEvent();

或更短:

result &= myObjects[i].SendEvent();

背景

language specifications中所写:

The operation

x && y  

corresponds to the operation

x & y  

except that if x is false, y is not evaluated, because the result of the AND operation is false no matter what the value of y is. This is known as "short-circuit" evaluation.

请注意,没有 &&= 运算符(至少在我写这篇文章的时候)。这看起来 合理 因为通常使用 ..= 运算符,您会期望首先计算操作数,然后对左侧的变量进行一些操作。当然,这完全是风格和品味的问题,但我认为假设的 &&= 不会给出“足够的提示”,正确的操作数将不会被调用所有案例。

作为 LINQ 爱好者,我会这样做:

var result = (myObjects.Count(obj => obj.SendEvent()) == myObjects.Length);

如果您想打破第一个 false 值的循环,可以是:

var result = myObjects.All(obj => obj.SendEvent());