Simplify Overriding Equals (), GetHashCode () in C # für bessere Wartbarkeit

9

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

  1. Klingt das Implementierungsmuster?
  2. Ist das ausreichend, da die beitragenden Komponentenwerte gut verteilt sind? Muss ich beim Kombinieren von Auflistungselementen mit 31-zu-N multiplizieren, wenn ihr Hash gut verteilt ist?
  3. Es scheint, dass dieser Code in Code abstrahiert werden kann, der die Reflektion zum Ermitteln öffentlicher Eigenschaften verwendet, einen Ausdrucksbaum erstellt, der mit der handcodierten Lösung übereinstimmt, und den Ausdrucksbaum nach Bedarf ausführt. Erscheint dieser Ansatz vernünftig? Gibt es irgendwo eine Implementierung?
Eric J. 14.03.2012, 18:29
quelle

3 Antworten

4

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:

Ссылка

    
Eric J. 17.03.2012, 17:35
quelle
1
  

Ich finde, dass ich selbst Equals () und GetHashCode () häufig überschreibe

  • MSDN sagt: Überlasten Sie Equals und andere nicht für veränderbare Typen
  

Ist ausreichend, vorausgesetzt, dass die beitragenden Komponentenwerte gut verteilt sind?

  • Ja, aber hey sind nicht immer gut verteilt. Betrachte int Eigenschaften. Verschieben mit einigen (kleinen) Primzahlen wird empfohlen.
Henk Holterman 14.03.2012 18:45
quelle
0

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%     
Serj Sagan 11.04.2013 14:26
quelle