Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:编译器优化、函数调用和布尔表达式短路_C#_Optimization_Short Circuiting_Boolean Operations - Fatal编程技术网

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上面所说的。现在我们已经在堆栈溢出和正在运行的代码段中记录了它。再次感谢。