是否会执行逻辑表达式中的所有方法?

Tre*_*reb 0 c# optimization

在C#中,给出了两种方法

 bool Action1(object Data);
bool Action2(object Data);
Run Code Online (Sandbox Code Playgroud)

在这样的if语句中使用:

if ( Action1(Data) || (Action2(Data) )
{
    PerformOtherAction();
}
Run Code Online (Sandbox Code Playgroud)

Action2()如果仍然被称为Action1()返回true,或者是这个由编译器优化阻止,因为它已经知道,表达式会true

And*_*are 7

不,C#支持逻辑短路,所以如果Action1返回true则永远不会评估Action2.

这个简单的例子展示了C#如何处理逻辑短路:

using System;

class Program
{
    static void Main()
    {
        if (True() || False()) { }  // outputs just "true"
        if (False() || True()) { }  // outputs "false" and "true"
        if (False() && True()) { }  // outputs just "false"
        if (True() && False()) { }  // outputs "true" and "false"
    }

    static bool True()
    {
        Console.WriteLine("true");
        return true;
    }

    static bool False()
    {
        Console.WriteLine("false");
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*ald 5

只有在Action1()返回false时才会调用Action2()

这在概念上类似于

if (Action1(Data))
{
    PerformOtherAction();
} 
else if (Action2(Data))
{
    PerformOtherAction();
} 
Run Code Online (Sandbox Code Playgroud)