首页 > 解决方案 > 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() )
    // ???

这会短路吗?

标签: c#if-statementasync-awaitshort-circuiting

解决方案


是的,它会短路。您的代码相当于:

bool first = await first_check();
if (first)
{
    bool second = await second_check();
    if (second)
    {
        ...
    }
}

请注意,在等待返回的对象完成之前,它甚至不会调用 。所以请注意,这不会并行执行这两个检查。如果你想这样做,你可以使用:second_checkfirst_check

var t1 = first_check();
var t2 = second_check();

if (await t1 && await t2)
{
}

在那时候:

  • 这两个检查将并行执行(假设它们是真正异步的)
  • 它将等待第一次检查完成,如果第一次返回 true ,则仅等待第二次检查完成
  • 如果第一次检查返回 false 但第二次检查失败并出现异常,则异常将有效地被吞没
  • 如果第二次检查返回false真的很快但是第一次检查需要很长时间,那么整体操作会花费很长时间,因为它等待第一次检查首先完成

如果你想并行执行检查,一旦它们中的任何一个返回 false 就完成,你可能想为此编写一些通用代码,收集开始的任务,然后Task.WhenAny重复使用。(您还应该考虑您希望对由于另一个任务返回 false 而与最终结果实际上无关的任务引发的任何异常发生什么。)


推荐阅读