/ / Dlaczego obiekt Object.Equals jest lepszy od wywoływania obiektu String.Equals z instancji? - c #, ciąg, równość

Dlaczego Object.Equals woli wywoływać String.Equals z instancji? - c #, string, równość

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 № 1

Bo 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