Как и операторы &
и &&
, двойной оператор является оператором "короткого замыкания".
Например:
if(condition1 || condition2 || condition3)
Если условие 1 истинно, условия 2 и 3 НЕ проверяются.
if(condition1 | condition2 | condition3)
Это проверит условия 2 и 3, даже если 1 уже верно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хорошее повышение производительности, используя их.
Есть одна большая оговорка, NullReferences или подобные проблемы. Например:
if(class != null && class.someVar < 20)
Если класс равен нулю, оператор if остановится после того, как class != null
будет ложным. Если вы используете только &, он попытается проверить class.someVar
, и вы получите NullReferenceException
. С оператором «Ор» это может быть не такой уж ловушкой, так как маловероятно, что вы вызовете что-то плохое, но об этом следует помнить.
Никто никогда не использует одиночные операторы &
или |
, если только у вас нет схемы, в которой каждое условие является функцией, которая должна быть выполнена. Звучит как запах дизайна, но иногда (редко) это чистый способ делать вещи. Оператор &
«запускает эти 3 функции, и если одна из них возвращает false, выполняет блок else», в то время как |
«запускает только блок else, если никто не возвращает false» - может быть полезным, но как Сказано, часто это дизайнерский запах.
Существует второе использование операторов |
и &
: Побитовые операции .