C# 使用&;=关于C语言中的布尔值#

C# 使用&;=关于C语言中的布尔值#,c#,boolean,operators,short-circuiting,C#,Boolean,Operators,Short Circuiting,我在C#中有一个名为SendEvent的方法,它返回一个bool,表示它是否成功。我想循环遍历许多对象并对它们全部调用SendEvent,最后,如果所有SendEvent调用都成功,则得到一个结果变量,即bool,即true,如果至少有一个调用失败,则调用false 起初我是这样做的: bool result = true; for (int i = 0; i < myObjects.Length; i++) { result = result && myObjec

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

起初我是这样做的:

bool result = true;
for (int i = 0; i < myObjects.Length; i++)
{
    result = result && myObjects[i].SendEvent();
}
但我觉得这有点难看。我是否可以使用按位
&=
运算符始终执行
SendEvent
调用,并设置result的值,如下所示

bool result = true;
for (int i = 0; i < myObjects.Length; i++)
{
    result &= myObjects[i].SendEvent();
}
bool结果=true;
for(int i=0;i
&=
如何处理布尔值?它会执行操作员的两侧吗?结果变量的结果是什么?

如您所知,对于
bool
s
而言,
&
&
都被定义为“逻辑and”,但是
&
将短路:
如果第一个操作数是
false
则不会计算右侧的表达式。无论右侧表达式的结果是什么,
&&
表达式的结果将保持为
false
。首先,这通常是一种“性能攻击”,但如果正确的表达式有副作用,可能引发异常等,则必须考虑这一点。如果第一个操作数是
true
,则
|
运算符也会发生同样的情况

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

result = result & myObjects[i].SendEvent();
或更短:

result &= myObjects[i].SendEvent();
背景 正如文件中所述:

手术

x && y  
x & y  
对应于操作

x && y  
x & y  
除非
x
false
,否则不会计算
y
,因为 AND运算的结果是
false
无论
y的值是多少
是这就是所谓的“短路”评估


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

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

var result = (myObjects.Count(obj => obj.SendEvent()) == myObjects.Length);
如果您想在第一个
false
值上中断循环,它可以是:

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

它不是
&=
,而是
&&=
&=
是逻辑and的运算符。@dcg:不,OP希望调用事件,
&
也定义在
bool
s上。@WillemVanOnsem so
&=
与bool的
&=
相同?@dcg:,这很有意义,因为这样一个假设的
&&=
不能保证它背后的代码会被执行。@WillemVanOnsem my bad,错过了那一行嗯,我个人尽量避免在Linq中使用有副作用的谓词。。。如果(例如)某些代码将结果枚举两次(当然,一般情况下,您应该避免多次枚举
IEnumerable
事物),这可能会导致令人惊讶的事情@MatthewWatson:试图理解您所说的。你能举个简单的例子吗?另外,这将如何影响常规的
for
循环?@dotNET:我认为这并不重要,但Matthew可能想说的是,如果你有类似的东西:
somelist.Where(x=>SideEffect(x))
,那么
。Where
将被惰性地计算。因此,您不知道何时调用
副作用
,这可能导致不可预测的行为。一些
x
最终调用
副作用
可能需要几天的时间,然后调用可能会过时,等等。通常避免太多副作用函数始终是一种好做法。@WillemVanOnsem:非常感谢。我现在明白了。谢谢,这是一个很好的答案!:)