Обидві чеки різні. Перший перевіряє особистість , другий - рівність . Загалом два терміни однакові, якщо вони посилаються на один і той же об’єкт. Це означає, що вони рівні. Два доданки рівні, якщо їх значення однакові.
З точки зору програмування ідентичність, як правило, переплутується еталонною рівністю. Якщо вказівник на обидва терміни дорівнює (!), Об'єкт, на який вони вказують, точно такий самий. Однак якщо вказівники різні, значення об'єктів, на які вони вказують, все одно може бути рівним. У 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);Тепер перевірте це на реальність. Чи був ваш прогноз правильним? Якщо ні, чи можете ви пояснити розбіжність?