C#:编译器优化、函数调用和布尔表达式短路
假设我们有以下昂贵的功能:C#:编译器优化、函数调用和布尔表达式短路,c#,optimization,short-circuiting,boolean-operations,C#,Optimization,Short Circuiting,Boolean Operations,假设我们有以下昂贵的功能: bool ExpensiveOp1() { ... } bool ExpensiveOp2() { ... } bool ExpensiveOp3() { ... } 此外,为了简单起见,假设它们都没有副作用 我知道,如果ExpensiveOp1或ExpensiveOp2在以下表达式中返回false,C#会短路: return ExpensiveOp1() && ExpensiveOp2() && ExpensiveOp3(); 然
bool ExpensiveOp1() { ... }
bool ExpensiveOp2() { ... }
bool ExpensiveOp3() { ... }
此外,为了简单起见,假设它们都没有副作用
我知道,如果ExpensiveOp1
或ExpensiveOp2
在以下表达式中返回false
,C#会短路:
return ExpensiveOp1() && ExpensiveOp2() && ExpensiveOp3();
然而,如果我以这种方式编写代码,编译器是否足够聪明(因为没有更好的术语)内联函数调用并利用短路
var x = ExpensiveOp1();
var y = ExpensiveOp2();
var z = ExpensiveOp3();
return x && y && z;
不,这是有充分理由的。编译器不知道您的任何操作是否有副作用,因此,如果您在布尔短路情况之外运行它们,它会在有副作用的情况下运行它们。您可以转到
var x=expensieop1;var y=费用OP2;var z=费用OP3;返回x()&&y()&&z()代码>如果你真的有麻烦的话。谢谢,@JohanP。我可能会用本地函数做类似的事情。我简化了我的例子,以消除不相关的细节。实际上,我将长布尔表达式的结果分配给x
、y
和z
。我可以将它们封装在简短命名的局部函数中,并将它们放在return
语句中。当心微优化的优先级…@Abion47,已确认并同意。我只是好奇,以防它成为一个问题。这就是我所怀疑的(害怕的?),但当我在网上环顾四周时,我很难确定这一点。谢谢你证实我的怀疑。@BradCollins你可以很容易地自己测试它。请看,编译器不知道任何有关副作用的信息,也不应该关心it@SergeyProsin使用C#8,他们添加了更多函数式编程风格的编译器提示,其中之一是能够将函数标记为“纯”(即没有副作用),因为在某些情况下,知道函数可以被忽略是件好事。@Abion47,谢谢你的.NET小提琴链接!这正是Turksarama上面所说的。现在我们已经在堆栈溢出和正在运行的代码段中记录了它。再次感谢。