Przygotowuję się do certyfikacji w języku C # i stawiam następujące pytanie (kod edytowany dla uproszczenia):
class Class
{
public string Name { get; set; } = "hello";
}
...
Class a = new Class();
Class b = new Class();
Class c = a;
Assert.IsTrue(a.Name == b.Name);
Assert.IsTrue(a.Name.Equals(b.Name));
Assert.IsTrue(Object.Equals(a.Name, b.Name));
Assert.IsTrue(a.Name == c.Name);
Assert.IsTrue(a.Name.Equals(c.Name));
Assert.IsTrue(Object.Equals(a.Name, c.Name));
Assert.IsTrue(a.Name == a.Name);
Assert.IsTrue(a.Name.Equals(a.Name));
Assert.IsTrue(Object.Equals(a.Name, a.Name));
Wszystkie te twierdzenia minęły.
Mówią o tym zrzuty testów certyfikacyjnych Object.Equals(*.Name, *.Name)
jest właściwą odpowiedzią i *.Name.Equals(*.Name)
jest źle.
Czemu?
Odpowiedzi:
7 dla odpowiedzi № 1Bo x.Name.Equals(y.Name)
rzuci NullReferenceException
gdyby x.Name
jest null
podczas Object.Equals(x.Name, y.Name)
wykona prawidłowe porównanie
1 dla odpowiedzi nr 2
Object.Equals
najpierw porównuje odwołania do obiektów, a następnie wywołuje String.Equals
do dalszej kontroli równości.
String.Equals
testuje ciągi pod kątem równości. Jest wywoływany z nazwą metody Equals lub z operatorem równości.
Object.Equals
porównuje zawartość obiektów. Najpierw sprawdza, czy odniesienia są równe, podobnie jak object.ReferenceEquals
. Ale następnie wywołuje pochodne metody Equals w celu dalszego testowania równości.
Przeczytaj więcej wyjaśnień na temat Object.Equals i String.Equals