1. ホーム
  2. c#

C#はawaitでif文の短絡的な評価を行うか?

2023-09-27 04:16:10

質問

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() )
    // ???

これが短絡的になることはないのでしょうか?

どのように解決するのですか?

これは超簡単な確認方法です。

このコードを試してみてください。

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); }

"Tested"と出力され、それ以外は何も出力されません。