Можно ли использовать побитовый оператор вместо логического оператора, такого как ИЛИ?

1

Это может быть глупо. Но у меня есть простые сомнения. Предположим, что у меня есть следующая проверка функции

bool Validate(string a , string b)
{
    if(a == null || b == null)
    {
        throw new NullReferenceException();
    }
    else
    {
    }
}

Можно ли использовать побитовое ИЛИ для проверки, как показано ниже

if(a == null | b == null)
  • 0
    Вы пробовали это? Я не уверен, если это имеет какое-либо значение при компиляции
  • 0
    Да, это работает. Но не уверен, что это правильно
Показать ещё 4 комментария
Теги:
logical-operators

4 ответа

9
Лучший ответ

В булевых выражениях (а не в целых и т.д.) Основное различие заключается в коротком замыкании. || короткие замыкания. | не. В большинстве случаев вам требуется короткое замыкание, поэтому || гораздо более распространены. В вашем случае это не имеет значения, поэтому || вероятно, следует использовать в качестве более ожидаемого выбора.

Время имеет значение:

if(politics.IsCeasefire() | army.LaunchTheRockets()) {
    // ...
}

против:

if(politics.IsCeasefire() || army.LaunchTheRockets()) {
    // ...
}

Первый всегда делает оба (предполагая, что исключение не выбрано); второй не запускает ракеты, если было вызвано прекращение огня.

  • 0
    это было хорошо .. Спасибо, я получил это сейчас
  • 1
    Ракеты - лучший пример побочных эффектов :)
Показать ещё 2 комментария
1

В этом случае (с аргументами bool) | оператор не является побитовым оператором. Это просто недолгосрочная версия логического or (||).

То же самое относится и к & vs. && - это просто некорректная версия логического and.

Разницу можно увидеть с побочными эффектами, например, в

bool Check()
{
    Console.WriteLine("Evaluated!");
    return true;
}

// Short-circuits, only evaluates the left argument.
if (Check() || Check()) { ... }

// vs.

// No short circuit, evaluates both.
if (Check() | Check()) { ... }
1

Это должно работать, потому что, когда они используются для вещей, которые оценивают bool, "побитовые" операторы выполняют логические операции одинаково. Тем не менее, вы можете считать его менее эффективным. Логические операторы в С# будут короткозамкнуты, то есть они будут пропускать оценку второго выражения, если ответ может быть выведен из первого. Итак, в вашем примере, если a == null равно true, тогда || вернется true сразу, в то время как | будет идти дальше и проверять b == null любом случае.

0

Как уже отмечалось, код действительно "хорошо".

Используя единственный канал '|' будет оценивать все выражения перед возвратом результата. '||' может быть более эффективным, поскольку он прекращается, как только выражение оценивается как true.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню