是否会执行逻辑表达式中的所有方法?
在C#中,给出了两种方法
bool Action1(object Data); bool Action2(object Data);
在if
语句中使用,如下所示:
if ( Action1(Data) || (Action2(Data) ) { PerformOtherAction(); }
如果Action1()
返回true仍然会调用Action1()
,或者编译器优化是否会阻止Action1()
,因为已经知道表达式将计算为true
?
只有在Action1()返回false时才会调用Action2()
这在概念上类似于
if (Action1(Data)) { PerformOtherAction(); } else if (Action2(Data)) { PerformOtherAction(); }
不,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; } }
你可以使用单个| 或&以获得两种方法执行。 这是Brainbench C#考试期待你了解的技巧之一。 可能在现实世界中没有任何用处,但仍然很高兴知道。 此外,它还可以让您以创造性和狡猾的方式混淆同事。
由于短路评估规则,如果Action1返回true,则不会调用Action2。 请注意,这是运行时优化,而不是编译时优化。
如果Action1()返回true,则不会计算Action2()。 C#(如C和C ++)使用短路评估。 这里的MSDN链接validation它。