C#: оптимизация компилятора, вызовы функций и короткое замыкание логического выражения
Давайте предположим, что у нас есть следующие дорогие функции:
bool ExpensiveOp1() { ... }
bool ExpensiveOp2() { ... }
bool ExpensiveOp3() { ... }
Кроме того, для простоты предположим, что ни у одного из них нет побочных эффектов.
Я знаю, что C# может замкнуть накоротко, если ExpensiveOp1
или же ExpensiveOp2
возвращается false
в следующем выражении:
return ExpensiveOp1() && ExpensiveOp2() && ExpensiveOp3();
Однако достаточно ли умен компилятор, чтобы (из-за отсутствия лучшего термина) встроить вызовы функций и воспользоваться преимуществами короткого замыкания, если я напишу код таким образом?
var x = ExpensiveOp1();
var y = ExpensiveOp2();
var z = ExpensiveOp3();
return x && y && z;
1 ответ
Решение
Нет, и по уважительной причине. Компилятор не знает, есть ли у каких-либо из ваших операций побочные эффекты, поэтому, если вы запускаете их вне логической ситуации короткого замыкания, он запускает их, если есть побочные эффекты, которые вы хотите.