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 ответ

Решение

Нет, и по уважительной причине. Компилятор не знает, есть ли у каких-либо из ваших операций побочные эффекты, поэтому, если вы запускаете их вне логической ситуации короткого замыкания, он запускает их, если есть побочные эффекты, которые вы хотите.

Другие вопросы по тегам