c# - C# 是否使用 await 对 if 语句执行短路评估?
问题描述
我相信 C# 一旦能够判断结果就会停止评估 if 语句条件。例如:
if ( (1 < 0) && check_something_else() )
// this will not be called
由于条件(1 < 0)
评估为false
,因此&&
条件不能满足,check_something_else()
也不会被调用。
C# 如何评估带有异步函数的 if 语句?是不是要等两个人都回来?例如:
if( await first_check() && await second_check() )
// ???
这会短路吗?
解决方案
是的,它会短路。您的代码相当于:
bool first = await first_check();
if (first)
{
bool second = await second_check();
if (second)
{
...
}
}
请注意,在等待返回的对象完成之前,它甚至不会调用 。所以请注意,这不会并行执行这两个检查。如果你想这样做,你可以使用:second_check
first_check
var t1 = first_check();
var t2 = second_check();
if (await t1 && await t2)
{
}
在那时候:
- 这两个检查将并行执行(假设它们是真正异步的)
- 它将等待第一次检查完成,如果第一次返回 true ,则仅等待第二次检查完成
- 如果第一次检查返回 false 但第二次检查失败并出现异常,则异常将有效地被吞没
- 如果第二次检查返回false真的很快但是第一次检查需要很长时间,那么整体操作会花费很长时间,因为它等待第一次检查首先完成
如果你想并行执行检查,一旦它们中的任何一个返回 false 就完成,你可能想为此编写一些通用代码,收集开始的任务,然后Task.WhenAny
重复使用。(您还应该考虑您希望对由于另一个任务返回 false 而与最终结果实际上无关的任务引发的任何异常发生什么。)