2010-10-06 7 views
14

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

Для Ex,

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 
+12

@ Модераторы: Прочитайте полный вопрос перед тем, как закрыть любой вопрос. Если у вас есть права закрыть любой вопрос, используйте их в нужном месте. –

+4

@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Поскольку вы все голосовали, чтобы закрыть этот вопрос. Пожалуйста, предоставьте мне правильный ответ на заданный выше вопрос или заново закройте вопрос. –

ответ

12

В соответствии со спецификацией это ожидаемое поведение.

Поведение первым регулируется разделом 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 затем реклассифицируется как ссылка на эту временную локальную переменную. Временная переменная доступна как таковая внутри M, но никак иначе. Таким образом, только если E - истинная переменная, то возможно, чтобы вызывающий наблюдал изменения, которые M делает с этим.
    • Список аргументов оценивается, как описано в п. 7.5.1.
    • M вызывается. Переменная, на которую ссылается E, становится переменной, на которую это ссылается.

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

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

EDIT: Я также хотел отдать должное опубликованному комментарию dtb, опубликованному, когда вопрос был закрыт. Я думаю, что он говорил то же самое, но с ограничением длины комментариев, которые он не смог выразить полностью.

4

Порядок оценки. ++ сначала оценивает (второй пример). Но в первом примере == выполняется сначала.

+1

Я не согласен попробовать это, см. Отредактированную часть –

+2

Вау! Я не верю своим глазам ... Я вернусь к вам – Aliostad

+2

Конечно, в любое время .... но результат останется прежним, даже если вы приедете через год ... :) –