Это может быть глупо. Но у меня есть простые сомнения. Предположим, что у меня есть следующая проверка функции
bool Validate(string a , string b)
{
if(a == null || b == null)
{
throw new NullReferenceException();
}
else
{
}
}
Можно ли использовать побитовое ИЛИ для проверки, как показано ниже
if(a == null | b == null)
В булевых выражениях (а не в целых и т.д.) Основное различие заключается в коротком замыкании. ||
короткие замыкания. |
не. В большинстве случаев вам требуется короткое замыкание, поэтому ||
гораздо более распространены. В вашем случае это не имеет значения, поэтому ||
вероятно, следует использовать в качестве более ожидаемого выбора.
Время имеет значение:
if(politics.IsCeasefire() | army.LaunchTheRockets()) {
// ...
}
против:
if(politics.IsCeasefire() || army.LaunchTheRockets()) {
// ...
}
Первый всегда делает оба (предполагая, что исключение не выбрано); второй не запускает ракеты, если было вызвано прекращение огня.
В этом случае (с аргументами 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()) { ... }
Это должно работать, потому что, когда они используются для вещей, которые оценивают bool
, "побитовые" операторы выполняют логические операции одинаково. Тем не менее, вы можете считать его менее эффективным. Логические операторы в С# будут короткозамкнуты, то есть они будут пропускать оценку второго выражения, если ответ может быть выведен из первого. Итак, в вашем примере, если a == null
равно true, тогда ||
вернется true
сразу, в то время как |
будет идти дальше и проверять b == null
любом случае.
Как уже отмечалось, код действительно "хорошо".
Используя единственный канал '|' будет оценивать все выражения перед возвратом результата. '||' может быть более эффективным, поскольку он прекращается, как только выражение оценивается как true.