== против равных в C #

В чем разница между оценкой == и Equals в C #?

Например,

if(x==x++)//Always returns true

но

if(x.Equals(x++))//Always returns false 

Отредактировано:

     int x=0;
     int y=0;

     if(x.Equals(y++))// Returns True
 Aditya Singh06 окт. 2010 г., 13:12
@ Модераторы: прочитайте полный вопрос, прежде чем закрывать любой вопрос. Если у вас есть права закрыть любой вопрос, используйте его в нужном месте.
 Aditya Singh06 окт. 2010 г., 19:00
@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Поскольку вы все проголосовали за закрытие этого вопроса. Пожалуйста, дайте мне правильный ответ на вопрос, заданный выше, или повторно откройте вопрос.

Ответы на вопрос(2)

Решение Вопроса

Поведение первого определяется разделом 7.3 спецификации:

Операнды в выражении оцениваются слева направо. Например, вF(i) + G(i++) * H(i), метод F вызывается с использованием старого значения i, затем метод G вызывается со старым значением i, и, наконец, метод H вызывается с новым значением i. Это отдельно от приоритета оператора и не связано с ним.

Таким образом, вx==x++сначала оценивается левый операнд (0), то оценивается правая рука (0, x становится1), тогда сравнение сделано:0 == 0 правда.

Поведение второго регулируется разделом 7.5.5:

Если M является членом функции экземпляра, объявленной втип ценности:E оценивается. Если эта оценка вызывает исключение, дальнейшие шаги не выполняются.Если E не классифицируется как переменная, то создается временная локальная переменная типа E, и этой переменной присваивается значение E. Затем E переклассифицируется как ссылка на эту временную локальную переменную. Временная переменная доступна как это в пределах M, но никаким другим способом. Таким образом, только когда E является истинной переменной, вызывающий может наблюдать изменения, которые M вносит в это.Список аргументов оценивается, как описано в §7.5.1.M вызывается. Переменная, на которую ссылается E, становится переменной, на которую ссылается this.

Обратите внимание, чтотипы значений передаются по ссылке к своим собственным методам.

Таким образом, вx.Equals(x++)сначала оценивается цельxпеременная), затем оцениваются аргументы (0, x становится1), тогда сравнение сделано:x.Equals(0) ложно

РЕДАКТИРОВАТЬ: Я также хотел отдать должное отозванный сейчас комментарий dtb, опубликованный, когда вопрос был закрыт. Я думаю, что он говорил то же самое, но с ограничением длины комментариев он не смог выразить это полностью.

ре == выполняется первым.

 Aditya Singh06 окт. 2010 г., 13:11
я не согласен попробовать это, см. отредактированную часть
 Aliostad06 окт. 2010 г., 14:02
Вот Это Да! Я не могу поверить своим глазам ... Я вернусь к тебе
 Ben Voigt07 окт. 2010 г., 23:14
Это не порядок оценки, точно. Цель метода Equals оценивается первой. Но результатом является не значение x (0), а адрес x, потому что методы для типов значений получают указатель «this», а не значение цели.
 Bubblewrap07 окт. 2010 г., 10:15
Я думаю, что общая идея этого ответа верна для 2-го и 3-го примера: 1. Оценивается параметр Equals, он «резервирует» 0 в качестве параметра-значения, но также увеличивает x на 1. 2. Равно выполняется. если x = 0, то x.Equals (x ++) становится 1.Equals (0). Разница между 1-м и 2-м примером заключается в том, что == выполняется до того, как для самого x установлено значение x + 1. Если вы перегружаете операторы структуры и отлаживаете, вы увидите, что он на самом деле перейдет в ++ до ==, но ничего не сделает с результатом из ++ до тех пор, пока не будет оценено выражение, в котором он встречается.
 Aditya Singh06 окт. 2010 г., 19:02
Конечно в любое время .... но результат останется прежним, даже если вы приедете через год ... :)

Ваш ответ на вопрос