Они не одинаковы. Один является побитовым ИЛИ, а другой - логическим ИЛИ.
X || Y, является логическим или, означает то же самое, что и «X или Y» и применяется к значениям bool. Используется в условных выражениях или тестах. X и Y в этом случае могут быть заменены любым выражением, которое оценивается как bool. Пример:
if (File.Exists("List.txt") || x > y ) { ..}
Предложение оценивается как истинное, если выполняется одно из двух условий. Если первое условие истинно (если файл существует), то второе условие не нужно и не будет оцениваться.
Одиночная труба (|) является побитовым ИЛИ. Чтобы знать, что это значит, вы должны понимать, как числа хранятся на компьютере. Предположим, у вас есть 16-разрядное количество (Int16), которое содержит значение 15. На самом деле оно хранится как 0x000F (в шестнадцатеричном формате), что соответствует 0000 0000 0000 1111 в двоичном виде. Побитовое ИЛИ принимает две величины и каждую пару соответствующих битов ИЛИ вместе, так что если бит равен 1 в любом количестве, он равен 1 в результате. Следовательно, если a = 0101 0101 0101 0101 (который оценивается в 0x5555 в шестнадцатеричном виде) и b = 1010 1010 1010 1010 (что равно 0xAAAA), то a | b = 1111 1111 1111 1111 = 0xFFFF.
Вы можете использовать побитовое ИЛИ (одиночный канал) в C #, чтобы проверить, включен ли один или несколько из определенного набора битов. Вы можете сделать это, если у вас есть, скажем, 12 логических или двоичных значений для проверки, и все они независимы. Предположим, у вас есть база данных студентов. Набором независимых логических значений могут быть такие вещи, как «мужчина / женщина», «дом / на кампусе», «текущий / не текущий», «зарегистрирован / не зарегистрирован» и т. Д. Вместо того, чтобы хранить логическое поле для каждого из этих значений, вы можете сохранить только один бит для каждого. Мужской / женский может быть бит 1. зарегистрирован / не может быть бит 2.
Тогда вы можете использовать
if ((bitfield | 0x0001) == 0x0001) { ... }
в качестве теста, чтобы увидеть, включены ли никакие биты, кроме бита "студент-мужчина", который игнорируется. А? Ну, побитовое ИЛИ возвращает 1 для каждого бита, который включен в любом числе. Если результат побитового ИЛИ выше = 0x0001, это означает, что в битовом поле нет включенных битов, за исключением возможно первого бита (0x0001), но вы не можете точно сказать, является ли первый бит включен, потому что он замаскирован.
Существует соответствующий && и &, который является логическим И и побитовым И. У них аналогичное поведение.
Вы можете использовать
if ((bitfield & 0x0001) == 0x0001) { ... }
чтобы увидеть, включен ли первый бит в битовом поле.
РЕДАКТИРОВАТЬ: Я не могу поверить, что меня за это проголосовали!