В чем разница между оценкой == и 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
В чем разница между оценкой == и 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
В соответствии со спецификацией это ожидаемое поведение.
Поведение первым регулируется разделом 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, опубликованному, когда вопрос был закрыт. Я думаю, что он говорил то же самое, но с ограничением длины комментариев, которые он не смог выразить полностью.
Порядок оценки. ++ сначала оценивает (второй пример). Но в первом примере == выполняется сначала.
Я не согласен попробовать это, см. Отредактированную часть –
Вау! Я не верю своим глазам ... Я вернусь к вам – Aliostad
Конечно, в любое время .... но результат останется прежним, даже если вы приедете через год ... :) –
@ Модераторы: Прочитайте полный вопрос перед тем, как закрыть любой вопрос. Если у вас есть права закрыть любой вопрос, используйте их в нужном месте. –
@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Поскольку вы все голосовали, чтобы закрыть этот вопрос. Пожалуйста, предоставьте мне правильный ответ на заданный выше вопрос или заново закройте вопрос. –