IComparable-und Equals()
Vom MSDN
Typen, die die IComparable implementieren, müssen Equals überschreiben.Typen, überschreiben von Equals muss auch GetHashCode überschreiben; ansonsten Hashtable möglicherweise nicht korrekt.
Ich habe es nicht ganz verstanden. Kann das jemand erklären.
- Für mehr die Beziehung zwischen Equals und GetHashCode: stackoverflow.com/questions/371328/...
- Beachten Sie auch, dass, während es ist notwendig, dass die Verträge von IComparable, Equals und GetHashCode() einzuhalten sind in jedem Fall, es ist nicht unbedingt erforderlich, explizit zu implementieren, die alle drei, so lange, wie konsistente Ergebnisse erzielt werden. In Erster Linie bedeutet, dass zwei Objekte mit demselben hash-code gleich sind, und 0 zurück auf CompareTo().
- Ich denke, die Aussage ist falsch: 'vor Allem bedeutet, dass zwei Objekte mit demselben hash-code gleich sind, und 0 zurück auf CompareTo().' . Wenn die Objekte Gleich sind, ist es empfehlenswert, GetHashCode (), um wieder den gleichen Wert und CompareTo() auf 0 zurück. Sie können ganz einfach erzeugen unterschiedliche/nicht gleich Instanzen, die denselben hash-code haben 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
IComparable ist eine Schnittstelle, die definiert, dass zwei Instanzen der implementierenden Klasse gesehen werden kann, wie größer als, kleiner als oder gleich einer anderen. Da haben Sie definiert Gleichstellung in die Methoden der Schnittstelle müssen Sie auch das überschreiben der Equals-Methode (und Gleichheits-operator), um sicherzustellen, die Ergebnisse aus den beiden konsistent sind.
Im obigen Beispiel habe ich implementiert IComparable, aber nicht überschrieben Entspricht. Wenn Sie anrufen CompareTo mit zwei getrennten Instanzen der Klasse, die den gleichen Wert haben, wird sagen, es gleiche. Wenn Sie anrufen, Gleich mit den gleichen zwei Instanzen wird es sagen, Sie sind nicht gleich, als er den test, um zu sehen, wenn Sie das gleiche Objekt (die default-Implementierung von Equals).
Zwei gleiche Gegenstände sollten wieder den gleichen hash-code (das sind verwendet für die schnelle Suche nach Elementen, die als Schlüssel in hash-Tabellen) so, wenn Sie Equals überschreiben, dann sollten Sie auch GetHashCode überschreiben()
Als ein Beispiel, das ich erstellt habe folgende Klasse in meiner IDE:
Ran und Resharper hilfreich "Generieren " Gleichheit" - Funktion sagen, dass ich wollte, dass beide A und B zu beeinflussen Gleichheit. Dies ist der code, den Sie erstellt:
Also, wenn Sie das überschreiben von Equals, dann sollten Sie auch festlegen, alle der oben genannten, um zu gewährleisten Konsistenz, wenn Sie die IComparable-dann gilt das gleiche.
CompareTo()
zu null zurückgeben, aber fürEquals()
"false" zurückgegeben (z.B. würde ich postulieren, dassDecimal
sollte Verhalten sich beim Vergleich1.0m
und1.00m
). Meiner Meinung nachEquals
definieren sollte, eine relativ strikte Gleichheit Beziehung, auch in Fällen, in denen==
oderCompareTo
definieren kann ein lockerer ein.IComparable verwendet für den Vergleich von zwei Objekten, wenn diese als gleich betrachtet werden, dann Vergleichen Sie 0 zurück. Es wäre sehr unerwartet ist, wenn IComparable.Vergleichen Sie die zurückgegebenen null für zwei Objekte, doch obj1.Equals(obj2) false zurück, da dies bedeuten würde, zwei unterschiedliche Bedeutungen von Gleichstellung für die Objekte.
Wenn eine Klasse überschreibt Equals, sollte es auch GetHashCode überschreiben, da zwei gleiche Objekte sollten hash den gleichen Wert, und dieser hash sollte auf die Felder/Eigenschaften, die bei der Umsetzung von Gleichstellung.
Gibt es zwei Möglichkeiten, dass Objekte in Ihrem code verglichen werden konnte:
Equals
undGetHashCode
Für Ihr Objekt verglichen werden korrekt in ALLEN Situationen, beim überschreiben der
Equals
- Methode (für Vergleiche), müssen Sie auch überschreibenGetHashCode
(in der Ruhe).Wenn Sie übergehen, aber nicht die anderen, je nach Ihrem code könnten Sie unerwartete Ergebnisse erhalten.