C # - |и операторы? - PullRequest
       46

C # - |и операторы?

2 голосов
/ 08 января 2012

edit: мой главный вопрос сейчас, почему эти два оператора должны быть перегружены, чтобы использовать && и || операторы. Разве операторы короткого замыкания не будут принимать истинные или ложные значения объектов и сравнивать их? Где в использовании && и || операторы это | и & использовали?

Я читаю C #, полный справочник, и я совершенно запутался в | и операторы. Я привык к тому, что они являются побитовыми операторами, которые сравнивают биты двух целых чисел, но они объясняются как оригинальные логические операторы, к которым && и || являются версиями короткого замыкания, которые останавливают тестирование значений, когда утверждение определенно будет определенным значением.

Означает ли это, что два оператора имеют многократное использование, или что C # выполняет закулисное приведение типов?

Кроме того, при использовании && и || операторы в классе, почему | и & должны быть перегружены? Почему нельзя перегрузить только значения true и false для класса?

Ответы [ 2 ]

14 голосов
/ 08 января 2012

Операторы | и & - это побитовые операции с целыми числами и активные логические операции с логическими операциями. Операторы || и && являются логическими операторами lazy в логических значениях.

Кроме того, при использовании && и || операторы в классе, почему | и & должны быть перегружены? Почему нельзя перегрузить только значения true и false для класса?

У вас есть класс Foo с перегруженным оператором true и false. Вы хотите, чтобы оператор && на Foo взял два Foo и вернул третий. Объясните, как вы планируете это делать, используя только операторы true и false.

Зачем нам нужны энергичные логические операторы в C #?

В случае, если вы хотите оценить побочные эффекты двух логических значений и применить к ним логическую операцию.

Я не понимаю, с && и || операторы, я хочу вернуть bool, а не другой тип.

Тогда вам не нужно перегружать ничего. Просто напишите оператор неявного преобразования из Foo в bool, и вы сможете использовать |, ||, & и && для вашего сердца.

Просто потому, что вы не хотите иметь && или || оператор, который возвращает что-то отличное от bool, не означает, что никто не делает. Предположим, что вместо Foo вы хотите написать трехзначный логический оператор, где значением может быть True, False или Neither. Вы можете определить & и | и && и || операторы True, False и Neither. Очевидно, вы не хотели бы, чтобы операторы возвращали bool; Вы хотите, чтобы они вернули Истину, Ложь или Ни того, ни другого.

Что я не понимаю, так это то, что | и операторы & имеют отношение к && и || операторы.

Они точно такие же операторы . Разница лишь в том, что ленивые не оценивают второй операнд, если это не нужно.

Почему должен | и & быть перегружен для использования || и хотя?

См. Предыдущий вопрос и ответ.

| и операторы & принимают два операнда.

Да, они делают. Так же и && и || операторы.

0 голосов
/ 08 января 2012

Я не ожидал, что смогу найти ответ в Интернете, иначе я бы не спросил здесь, но мне удалось, и вот что у меня есть:

С http://msdn.microsoft.com/en-us/library/aa691312(v=vs.71).aspx он говорит: The operation x && y is evaluated as T.false(x) ? x : T.&(x, y)

Другими словами, он оценивает истинное или ложное значение x и, если x ложно, возвращает x, в противном случае возвращается x & y.Это объясняет, почему два |и операторы & должны быть перегружены для && и ||, но это не объясняет, почему они не оцениваются как:

T.false(x) ? x : T.false(y) ? y : x

Если кто-то может объяснить, почему сравниваются y и x, я был бы признателен.

...