In .NET müssen Sie, dass Equals (Objekt) und GetHashCode() kompatibel sind. Aber manchmal kann man nicht:Wie implementiert man eine kompatible GetHashCode-Methode, wenn der Speicherplatz größer als 32 Bits ist?
public class GreaterThan32Bits
{
public int X { get; set; }
public int Y { get; set; }
}
Da die Datendichte von mehr als 32 Bits ist, und GetHashCode gibt einen Int32, erhalten Sie 3 Lösungen haben (vorausgesetzt, ein korrekt implementiert GetHashCode):
vermeiden Code-Duplizierungals falschpublic override bool Equals(object other) { if(ReferenceEquals(null, other)) return false; if(ReferenceEquals(this, other)) return true; return this.GetHashCode() == other.GetHashCode(); }
Implementieren Gleich getrennt von GetHashCode()
public override bool Equals(object obj) { if(ReferenceEquals(null, other)) return false; if(ReferenceEquals(this, other)) return true; var other = obj as GreaterThan32Bits; if(this.X == other.X) return this.Y == other.Y; return false; }
eine größere Präzision GetHashCode64 Implement, die overrided GetHashCode (32 Bits) wird zurückkehren (int) GetHashCode64() und equals kehrt this.GetHashCode64() == anderer .GetHashCode64()
Welchen würden Sie implementieren?
Die erste Lösung ist
ungenau
falsch, aber sauberer. Die zweite Option scheint sauber zu sein, wird aber sehr komplex, wenn die Klasse mehr Eigenschaften hat. Die dritte Option ist ein Kompromiss.
Ihre Frage erneut lesen: Ich denke, Sie sollten die Methoden GetHashCode und Equals einfach getrennt halten. GetHashCode() sollte genau das tun: einen Hashcode erzeugen. Equals sollte die beiden Objekte auf Gleichheit vergleichen. –
+1 für die Beantwortung der Frage mit diesem Kommentar –