我在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();
背景
The operation
06002
corresponds to the operation
06003
except that if
x
isfalse
,y
is not evaluated, because the
result of the AND operation isfalse
no matter what the value ofy
is. This is known as “short-circuit” evaluation.
请注意,没有&& =运算符(至少在我写这篇文章的时候).这看起来很合理,因为通常使用.. =运算符,您会期望首先计算操作数,然后对左侧的变量执行某些操作.当然,这完全是风格和品味的问题,但我认为假设的&& =并没有提供“足够的提示”,即在所有情况下都不会调用正确的操作数.