Сегодня я столкнулся с некоторым кодом, который проверял ряд ошибок. Единственное логическое значение использовалось на всем протяжении, но вместо того, чтобы переназначать его каждый раз с помощью =
, оно было переназначено с помощью &=
, что привело к бит мудному ANDing предыдущего значения булева и нового значения. Код выглядел примерно так:Есть ли причина использовать & =, а не просто = на логическом?
bool result = FirstCheck();
Assert(result);
result &= SecondCheck();
Assert(result);
...
Теперь мне любопытно, почему кто-то это сделает? Это логически эквивалентно только переназначение логического значения, как показано на возможные ветви ниже:
- FirstCheck терпит неудачу (возвращает ложь) и программа терпит неудачу на утверждают, и никогда не делает его SecondCheck
- FirstCheck проходит (возвращается true), и программа переходит к SecondCheck. Если SecondCheck возвращает true, тогда результат будет истинным, потому что true & true = true. Если SecondCheck возвращает false, результат будет false, потому что true & false = false.
Поскольку нет никакой логической разницы, есть ли какая-то другая причина, возможно, предпочтительнее &=
? Или, скорее всего, это реликвия какого-то старого кода, который никогда не менялся?
EDIT: Чтобы уточнить, Assert всегда является активным кодом. Я фактически наткнулся на этот код, исследуя ошибку, потому что утверждение не срабатывало.
Существуют случаи, когда битовые операторы быстрее, чем логических? – GBleaney
Это * не * выполняет побитовое И. Оператор '&', вызываемый в буле в C#, просто выполняет короткое замыкание AND. Так что это никогда не будет быстрее, это может быть медленнее. Это нужно делать только в том случае, если важно, чтобы побочные эффекты «SecondCheck» выполнялись независимо от значения «результата». Либо это, либо это просто ошибка. – Servy