Den*_*nis 0 c# side-effects boolean-expression
class Program
{
static void Main(string[] args)
{
bool success = true;
int[] array = { 10, 15, 20 };
foreach (var i in array)
success = success && SynchronizeAccount(i);
}
static bool SynchronizeAccount(int i)
{
Console.WriteLine(i);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
输出为10.在第一步之后,'success'变为false并且永远不会为true,因此c#在第一次迭代后停止循环执行.但我需要SynchronizeAccount的SIDE效果,而不是'成功'值.
Nie*_*jes 18
这不是一个错误,因为在几乎所有编程语言中C#都&&懒惰地计算- 如果左操作数已经为假,则整个表达式永远不会成为真,因此不再需要它来评估表达式的右操作数.
翻转操作数或更改为success & SynchronizeAccount强制评估两个操作数.
请注意,它是C#的一个独特功能,您可以同时应用它们&和&&布尔值 - 在大多数其他语言(包括Java和PHP &)中,单个&符号()是按位AND,它通常提供完全不同的结果.
这不是错误,这是正常行为.该&&运营商将只评估操作者的右侧,如果左侧的评估为true:
条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数.
因此,在第一次迭代之后,success计算到false,并且SynchronizeAccount不再被调用.
如果您想评估SynchronizeAccount它返回的内容,请使用&运算符:
foreach (var i in array)
success = success & SynchronizeAccount(i);
Run Code Online (Sandbox Code Playgroud)
或者更简单:
foreach (var i in array)
success &= SynchronizeAccount(i);
Run Code Online (Sandbox Code Playgroud)
或者也许使用一点Linq:
bool success = array.Aggregate(true, (b, i) => b & SynchronizeAccount(i));
Run Code Online (Sandbox Code Playgroud)