在C#中使用&= on boolean值

我在C#中有一个名为SendEvent的方法,它返回一个bool,表示它是否成功.我想循环遍历许多对象并在它们上面调用SendEvent,最后,得到一个bool的结果变量,如果所有SendEvent调用都成功则为true,如果至少有一个失败则为false.

起初我这样做了:

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

但这将导致如果一个失败,将不会在后续对象上调用SendEvent,因为&& amp;如果结果为false,则不会执行operator.

所以我把它转过来:

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

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

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

& =如何处理布尔值?它会执行操作符的两面吗?什么会在结果变量中结束?

解决方法:

正如你可以阅读here,两者兼而有之.和&&被定义为bools为“逻辑和”,但&&将短路:如果第一个操作数为假,则不会评估右侧的表达式.无论右边表达的结果如何,&&&表达将保持错误.这通常是一个“性能黑客”,但如果正确的表达有副作用,可能会抛出异常,等等,这是你必须要考虑的事情.对于||也是如此运算符,如果第一个操作数为true.

因此,如果您想先评估双方,您确实可以使用:

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

或更短:

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

背景

正如language specifications所写:

The operation

06002

corresponds to the operation

06003

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.

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

上一篇:MySQL严格等同于操作符?


下一篇:C:为矩阵模板重载=运算符