Обе проверки разные. Первый проверяет идентичность , второй - равенство . В общем, два термина идентичны, если они относятся к одному и тому же объекту. Это означает, что они равны. Два члена равны, если их значения совпадают.
С точки зрения программирования идентичность обычно искажается ссылочным равенством. Если указатели на оба термина равны (!), То объект, на который они указывают, точно такой же. Однако, если указатели разные, значение объектов, на которые они указывают, может быть одинаковым. В C # идентичность можно проверить с помощью статического Object.ReferenceEqualsчлена, в то время как равенство проверяется с помощью нестатического Object.Equalsчлена. Так как вы бросаете два целых числа к объектам (который называется «бокс», кстати), то operatior ==из objectпреформ первый чек, который по умолчанию отображается в Object.ReferenceEqualsи проверяет идентичность. Если вы явно вызываете нестатический Equalsчлен, динамическая отправка приводит к вызову Int32.Equals, который проверяет равенство.
Обе концепции похожи, но не одинаковы. Сначала они могут показаться запутанными, но небольшая разница очень важна! Представьте себе двух человек, а именно «Алису» и «Боба». Они оба живут в желтом доме. Исходя из предположения, что Алиса и Боб живут в районе, где дома различаются только цветом, они оба могут жить в разных желтых домах. Если вы сравните оба дома, вы поймете, что они абсолютно одинаковые, потому что оба желтые! Однако они не живут в одном доме, и поэтому их дома равны , но не идентичны . Идентичность подразумевает, что они живут в одном доме.
Примечание : некоторые языки определяют ===оператора для проверки идентичности.
short myShort = 0; int myInt = 0; Console.WriteLine("{0}{1}{2}", myShort.Equals(myInt), myInt.Equals(myShort), myInt == myShort);Теперь сравните его с реальностью. Ваш прогноз оказался верным? Если нет, то можете ли вы объяснить расхождение?