Oba testy są różne. Pierwsza sprawdza tożsamość , druga równość . Ogólnie dwa terminy są identyczne, jeśli odnoszą się do tego samego przedmiotu. Oznacza to, że są równi. Dwa wyrazy są równe, jeśli ich wartości są takie same.
W kategoriach programowania tożsamość jest zwykle zakłócana przez równość odniesień. Jeśli wskaźnik na oba wyrazy są równe (!), Obiekt, na który wskazują, jest dokładnie tym samym. Jeśli jednak wskaźniki są różne, wartość obiektów, na które wskazują, może być nadal równa. W języku C # tożsamość można sprawdzić przy użyciu statycznego Object.ReferenceEqualselementu członkowskiego, podczas gdy równość jest sprawdzana przy użyciu niestatycznego Object.Equalselementu członkowskiego. Ponieważ rzutujesz dwie liczby całkowite na obiekty (co jest nazywane „boksowaniem”, btw), operator ==funkcji objectwykonuje pierwsze sprawdzenie, które jest domyślnie odwzorowywane na Object.ReferenceEqualsi sprawdza tożsamość. Jeśli bezpośrednio wywołasz element niestatyczny Equals, dynamiczne wysyłanie spowoduje wywołanie funkcji Int32.Equals, które sprawdza równość.
Obie koncepcje są podobne, ale nie takie same. Na początku mogą wydawać się zagmatwane, ale mała różnica jest bardzo ważna! Wyobraź sobie dwie osoby, a mianowicie „Alice” i „Bob”. Oboje mieszkają w żółtym domu. Wychodząc z założenia, że Alicja i Bob mieszkają w dzielnicy, w której domy różnią się tylko kolorem, oboje mogliby mieszkać w różnych żółtych domach. Jeśli porównasz oba domy, zauważysz, że są one absolutnie takie same, ponieważ oba są żółte! Jednak nie dzielą tego samego domu i dlatego ich domy są równe , ale nie identyczne . Tożsamość sugerowałaby, że mieszkają w tym samym domu.
Uwaga : niektóre języki definiują ===operatora do sprawdzania tożsamości.
short myShort = 0; int myInt = 0; Console.WriteLine("{0}{1}{2}", myShort.Equals(myInt), myInt.Equals(myShort), myInt == myShort);Teraz porównaj to z rzeczywistością. Czy twoja prognoza była poprawna? Jeśli nie, czy możesz wyjaśnić tę rozbieżność?