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

时间:2009-04-23 13:57:13

标签: c# optimization

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

 bool Action1(object Data);
bool Action2(object Data);

if语句中使用,如下所示:

if ( Action1(Data) || (Action2(Data) )
{
    PerformOtherAction();
}
如果Action2()返回true,

仍然会调用Action1(),或者编译器优化会阻止<{1}},因为已经知道表达式将计算为true吗?

5 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:5)

只有在Action1()返回false

时才会调用Action2()

这在概念上类似于

if (Action1(Data))
{
    PerformOtherAction();
} 
else if (Action2(Data))
{
    PerformOtherAction();
} 

答案 2 :(得分:2)

您可以使用单个|或者&amp;获得两种方法来执行。这是Brainbench C#考试希望你知道的技巧之一。可能在现实世界中没有任何用处,但仍然很高兴知道。此外,它还可以让您以创造性和狡猾的方式混淆同事。

答案 3 :(得分:1)

由于短路评估规则,如果Action1返回true,则不会调用Action2。请注意,这是运行时优化,而不是编译时优化。

答案 4 :(得分:1)

如果Action1()返回true,则不会评估Action2()。 C#(如C和C ++)使用短路评估。 MSDN Link在此进行验证。