Ich finde mein selbst überschreibendes Equals()
und GetHashCode()
häufig, um die Semantik zu implementieren, dass Geschäftsobjekte mit identischen Eigenschaftenwerten gleich sind. Dies führt zu Code, der sich wiederholt schreiben und zerbrechlich sein muss (Eigenschaft wird hinzugefügt und eine / beide der Außerkraftsetzungen werden nicht aktualisiert).
Der Code endet in etwa so (Kommentare zur Implementierung sind willkommen):
%Vor%Meine Fragen
MSDN sagt eigentlich nicht "Überlasten Sie Equals und andere nicht für veränderbare Typen". Früher hat es das gesagt, aber jetzt heißt es:
Wenn Sie eine Klasse oder Struktur definieren, entscheiden Sie, ob es sinnvoll ist Erstellen einer benutzerdefinierten Definition der Wertgleichheit (oder Äquivalenz) für der Typ. In der Regel implementieren Sie Wertgleichheit, wenn Objekte der Typ wird voraussichtlich zu einer Sammlung irgendeiner Art hinzugefügt, oder wann Ihr Hauptzweck besteht darin, eine Reihe von Feldern oder Eigenschaften zu speichern.
Dennoch gibt es Komplexitäten in Bezug auf die Stabilität des Hash-Codes, während ein Objekt an einer Hash-Sammlung beteiligt ist ( Dictionary<T,U>
, HashSet<T>
, etc.).
Ich entschied mich für das Beste aus beiden Welten, wie hier beschrieben:
Ich finde, dass ich selbst Equals () und GetHashCode () häufig überschreibe
Ist ausreichend, vorausgesetzt, dass die beitragenden Komponentenwerte gut verteilt sind?
int
Eigenschaften. Verschieben mit einigen (kleinen) Primzahlen wird empfohlen. Vielleicht bin ich hier verwirrt, aber sollte der on null
check keine 1 anstelle von 0 in der GetHashCode
override ausgeben?
Also
%Vor%sollte
sein %Vor%Tags und Links c# equals hashcode maintainability