在 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、&
和 &&
都为 bool
s 定义为“逻辑和”,但是&&
将短路:如果第一个操作数是false
右边的表达式不会被计算。不管右边表达式的结果是什么,&&
表达式的结果将保持 false
。这通常首先是 "performance hack",但如果正确的表达式有 副作用 ,可能会引发异常等,这是您必须考虑的事情帐户。如果第一个操作数是 true
.
,||
运算符也会发生同样的情况
所以如果你想先评估双方,你确实可以使用:
result = result & myObjects[i].SendEvent();
或更短:
result &= myObjects[i].SendEvent();
背景
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());
我在 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、&
和 &&
都为 bool
s 定义为“逻辑和”,但是&&
将短路:如果第一个操作数是false
右边的表达式不会被计算。不管右边表达式的结果是什么,&&
表达式的结果将保持 false
。这通常首先是 "performance hack",但如果正确的表达式有 副作用 ,可能会引发异常等,这是您必须考虑的事情帐户。如果第一个操作数是 true
.
||
运算符也会发生同样的情况
所以如果你想先评估双方,你确实可以使用:
result = result & myObjects[i].SendEvent();
或更短:
result &= myObjects[i].SendEvent();
背景
The operation
x && y
corresponds to the operation
x & y
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.
请注意,没有 &&=
运算符(至少在我写这篇文章的时候)。这看起来 合理 因为通常使用 ..=
运算符,您会期望首先计算操作数,然后对左侧的变量进行一些操作。当然,这完全是风格和品味的问题,但我认为假设的 &&=
不会给出“足够的提示”,正确的操作数将不会被调用所有案例。
作为 LINQ 爱好者,我会这样做:
var result = (myObjects.Count(obj => obj.SendEvent()) == myObjects.Length);
如果您想打破第一个 false
值的循环,可以是:
var result = myObjects.All(obj => obj.SendEvent());