Sollte eine Überschreibung von Equals bei einem Referenztyp immer den Wert Equality bedeuten?

Ohne etwas Besonderes für einen Referenztyp zu tun,Equals() würde Bezugsgleichheit bedeuten (d. h. dasselbe Objekt). Wenn ich mich entscheide zu überschreibenEquals() Sollte es bei einem Referenztyp immer bedeuten, dass die Werte der beiden Objekte gleich sind?

Betrachten Sie dies als veränderlichPerson Klasse:

class Person
{
    readonly int Id;

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

Zwei Objekte, die genau dieselbe Person darstellen, haben immer dieselbe PersonIdDie anderen Felder können sich jedoch im Laufe der Zeit unterscheiden (d. h. vor / nach einer Adressänderung).

Für dieses Objekt könnte Equals so definiert werden, dass es verschiedene Bedeutungen hat:

Wertgleichheit: Alle Felder sind gleich (zwei Objekte, die dieselbe Person darstellen, aber unterschiedliche Adressen haben, geben false zurück)Identität Gleichheit: dieIds sind gleich (zwei Objekte, die dieselbe Person darstellen, aber unterschiedliche Adressen haben, würden true zurückgeben)Referenzgleichheit: d. H. Implementieren Sie keine Gleichheit.

Frage: Welches (wenn überhaupt) davon ist für diese Klasse vorzuziehen? (Oder vielleicht sollte die Frage lauten: "Wie würden die meisten Clients dieser Klasse erwarten, dass sich Equals () verhält?")

Anmerkungen:

Die Verwendung von Value Equality erschwert die Verwendung dieser Klasse in aHashset oderDictionary

Die Verwendung von Identity Equality stellt die Beziehung zwischen Equals und the her= Operator seltsam (d. h. nach einer Prüfung von zwei Personenobjekten (p1 und p2) gibt true für zurückEquals()Möglicherweise möchten Sie Ihren Verweis dennoch aktualisieren, um auf das "neuere" Personenobjekt zu verweisen, da es nicht dem entsprechenden Wert entspricht. Der folgende Code liest sich zum Beispiel seltsam - scheint nichts zu bewirken, entfernt jedoch tatsächlich p1 und fügt p2 hinzu:

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);

Verwandte Fragen:

Warum empfiehlt Microsoft, die Implementierung eines Gleichheitsoperators für Referenztypen zu überspringen?C # Unterschied zwischen == und Equals ()Wann sollte eine .NET-Klasse Equals () überschreiben? Wann sollte es nicht sein?Vereinfachen Sie das Überschreiben von Equals () und GetHashCode () in C #, um die Wartbarkeit zu verbessern

Antworten auf die Frage(3)

Ihre Antwort auf die Frage