当前位置: 首页 > 知识库问答 >
问题:

C#是否使用WAIT对if语句执行短路评估?

张丁雷
2023-03-14

我相信C#一旦能够判断结果,就会停止评估if语句条件。例如:

if ( (1 < 0) && check_something_else() )
    // this will not be called

由于条件(1

C#如何使用异步函数计算if语句?它会等待双方的回归吗?例如:

if( await first_check() && await second_check() )
    // ???

这会短路吗?


共有3个答案

公孙芷阳
2023-03-14

是的。您可以使用以下sharplab.io自己检查:

public async Task M() {
    if(await Task.FromResult(true) && await Task.FromResult(false))
        Console.WriteLine();
}

编译器有效地将其转换为:

TaskAwaiter<bool> awaiter;

... compiler-generated state machine for first task...

bool result = awaiter.GetResult();

// second operation started and awaited only if first one returned true    
if (result)
{
     awaiter = Task.FromResult(false).GetAwaiter();
...

或者作为一个简单的程序:

Task<bool> first_check() => Task.FromResult(false);
Task<bool> second_check() => throw new Exception("Will Not Happen");

if (await first_check() && await second_check()) {}

sharplab上的第二个示例。io。

何华灿
2023-03-14

这非常容易检查。

请尝试以下代码:

async Task Main()
{
    if (await first_check() && await second_check())
    {
        Console.WriteLine("Here?");
    }
    Console.WriteLine("Tested");
}

Task<bool> first_check() => Task.FromResult(false);
Task<bool> second_check() { Console.WriteLine("second_check"); return Task.FromResult(true); }

它输出“已测试”而没有其他输出。

长孙沈义
2023-03-14

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

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

注意,在第一次检查返回的等待完成之前,它甚至不会调用第二次检查。请注意,这不会并行执行这两个检查。如果您想这样做,可以使用:

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

if (await t1 && await t2)
{
}

此时:

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

如果您希望并行执行检查,并在其中任何一个返回false时立即完成,您可能需要为此编写一些通用代码,收集要开始的任务,然后使用Task。当任何一次重复时。(您还应该考虑,如果由于另一个任务返回false,任务抛出的异常实际上与最终结果无关,您希望如何处理这些异常。)

 类似资料:
  • 问题内容: 是否在SQL WHERE子句中对布尔表达式进行短路求值 ? 例如: 如果 @key IS NULL的 计算结果为true,则 @key不是NOT AND @key = t.Key的 计算结果吗? 如果否,为什么不呢? 如果是,是否可以保证?它是ANSI SQL的一部分还是特定于数据库的? 如果是特定于数据库的SqlServer?甲骨文?MySQL的? 问题答案: ANSI SQL草稿2

  • 问题内容: 可以从python中的单行方法返回 寻找这样的东西 尝试过,并且语法无效 我可以轻松做到: 但只是好奇我是否可以将上述if语句合并为一行 问题答案: 可以在一行上编写标准的“ if”语句: 但是pep 8样式指南建议不要这样做: 通常不建议使用复合语句(同一行上有多个语句)

  • 问题内容: 我想知道JavaScript是否具有C#中的&&运算符之类的“短路”评估。如果没有,我想知道是否有一种合理的解决方法可以采用。 问题答案: 是的,JavaScript具有“短路”评估。

  • 问题内容: 给出以下代码: 如果返回,php解释器是否还会检查以后的条件,例如? 如果是这样,那么为什么它在不需要时会做额外的工作呢? 问题答案: 是的,PHP解释器是“惰性”的,这意味着它将尽可能少地进行比较以评估条件。 如果要验证,请尝试以下操作:

  • 问题内容: 我希望使用Python函数来帮助我进行计算,但是如果击中a时不立即求值,则该过程可能会花费更长的时间。我认为这可能是经过短路评估的,但我只是想确定一下。另外,有没有一种方法可以在Python中说明如何评估函数? 问题答案: 是的,它会短路: 从文档: 如果iterable的所有元素都为true(或者iterable为空),则返回True。相当于: 因此,当它为False时,该函数立即中

  • C++ 判断 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C++ 中 if 语句的语法: if(boolean_expression) { // 如果布尔表达式为真将执行的语句 } 如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。 C 语言把任何非零和非空的值假定为 t