Ich habe GetHashCode
und Equals
überschrieben und beide Methoden liefern dieselben Ergebnisse für verschiedene Objekte, aber warum wird immer noch falsch?
Weil der Operator ==
standardmäßig auf die Referenzgleichheit verweist. Es ruft nicht Ihre Equals
-Methode auf.
Sie können den Operator ==
überschreiben, wenn Sie möchten. Siehe: Richtlinien zum Überschreiben von Equals () und Operator ==
In C # gibt es zwei verschiedene Arten von Gleichheit: Referenzgleichheit (auch bekannt als Identität) und Wertgleichheit. Wertgleichheit ist die allgemein verstandene Bedeutung von Gleichheit: Es bedeutet, dass zwei Objekte die gleichen Werte enthalten. Zum Beispiel haben zwei ganze Zahlen mit dem Wert 2 Wertgleichheit. Referenzgleichheit bedeutet, dass nicht zwei Objekte zu vergleichen sind. Stattdessen gibt es zwei Objektreferenzen, und beide verweisen auf dasselbe Objekt.
[...]
Standardmäßig testet der Operator == auf Referenzgleichheit, indem er feststellt, ob zwei Referenzen dasselbe Objekt anzeigen. Daher müssen Referenztypen den Operator == nicht implementieren, um diese Funktionalität zu erhalten. Wenn ein Typ unveränderlich ist, dh die Daten, die in der Instanz enthalten sind, nicht geändert werden können, kann das Überladen von operator == zum Vergleichen der Wertegleichheit anstelle der Referenzgleichheit nützlich sein, da sie als unveränderliche Objekte als gleich lang angesehen werden können wie sie den gleichen Wert haben. Es ist keine gute Idee, den Operator == in nicht unveränderlichen Typen zu überschreiben.
==
ist in diesem Fall ein Referenzgleichheitsoperator. Es vergleicht, ob zwei Referenzen identisch sind.
Der new
-Operator erzeugt immer ein neues -Objekt, so dass ein new Something()
NIE ein identischer Verweis auf ein anderes new Something()
ist.
Sie können den Operator ==
überschreiben, um anstelle eines Referenzvergleichs einen Wertevergleich durchzuführen. Dies ist z.B. String
tut das.
Der Operator ==
überprüft, ob zwei Variablen tatsächlich auf dasselbe Objekt im Speicher verweisen. In Ihrem Beispiel erstellen Sie zwei James. Sie könnten Zwillinge sein (d. H. Sie könnten den gleichen Speicherbedarf haben), aber sie sind nicht die gleiche Person (d. H. Sie haben zwei verschiedene Speicherorte). Wenn du geschrieben hast:
Sie würden true
erhalten, weil a und b nur zwei Namen für den gleichen James sind.
Tags und Links .net c# equals gethashcode