Czy nadpisanie Równych na typie odniesienia zawsze oznacza równość wartości?

Bez robienia niczego specjalnego dla typu referencyjnegoEquals() oznaczałoby równość odniesienia (tj. ten sam obiekt). Jeśli zdecyduję się zastąpićEquals() czy dla typu odniesienia zawsze powinno oznaczać, że wartości dwóch obiektów są równoważne?

Rozważ to zmiennePerson klasa:

class Person
{
    readonly int Id;

    string FirstName { get; set; }
    string LastName { get; set; }
    string Address { get; set; }
    // ...
}

Dwa obiekty, które reprezentują tę samą osobę, zawsze będą miały to samoId, ale inne pola mogą się różnić w czasie (tj. przed / po zmianie adresu).

Dla tego obiektu Równe mogą być zdefiniowane jako różne rzeczy:

Równość wartości: wszystkie pola są równe (dwa obiekty reprezentujące tę samą osobę, ale z różnymi adresami zwrócą fałsz)Równość tożsamości:Ids są równe (dwa obiekty reprezentujące tę samą osobę, ale z różnymi adresami zwrócą prawdę)Równość referencyjna: tj. Nie implementuj Równych.

Pytanie: Które z nich (jeśli w ogóle) jest preferowane w tej klasie? (A może pytanie powinno brzmieć: „jak większość klientów tej klasy spodziewa się, że Equals () zachowa się?”)

Uwagi:

Użycie równości wartości utrudnia korzystanie z tej klasy wHashset lubDictionary

Korzystanie z równości tożsamości sprawia, że ​​relacja między równymi a= operator dziwny (tj. po sprawdzeniu dwóch obiektów Person (p1 i p2) zwraca wartość true dlaEquals(), nadal możesz zaktualizować swoje odniesienie, aby wskazywało na „nowszy” obiekt Person, ponieważ nie jest on równoważny wartości). Na przykład poniższy kod brzmi dziwnie - wygląda na to, że nic nie robi, ale faktycznie usuwa p1 i dodaje p2:

HashSet<Person> people = new HashSet<Person>();
people.Add(p1);
// ... p2 is an new object that has the same Id as p1 but different Address
people.Remove(p2);
people.Add(p2);

Powiązane pytania:

Dlaczego Microsoft zaleca pominięcie implementacji operatora równości dla typów referencyjnych?C # różnica między == i równa się ()Kiedy należy zastąpić klasę .NET ()? Kiedy nie powinien?Uprość nadpisywanie Equals (), GetHashCode () w C # dla lepszej konserwacji

questionAnswers(3)

yourAnswerToTheQuestion