Warum falsch zurückkommen? neue Person ("James") == neue Person ("James")?

8

Ich habe GetHashCode und Equals überschrieben und beide Methoden liefern dieselben Ergebnisse für verschiedene Objekte, aber warum wird immer noch falsch?

%Vor%     
Freshblood 03.08.2010, 11:09
quelle

5 Antworten

26

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.

    
dtb 03.08.2010, 11:10
quelle
5

Sie müssen den Operator == separat überschreiben, wenn Sie das wirklich wollen.

Ссылка

    
Nick 03.08.2010 11:11
quelle
2

Ja dtb ist richtig, du willst

%Vor%

stattdessen

    
w69rdy 03.08.2010 11:12
quelle
2

== 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.

Siehe auch

Verwandte Fragen

polygenelubricants 03.08.2010 11:12
quelle
2

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:

%Vor%

Sie würden true erhalten, weil a und b nur zwei Namen für den gleichen James sind.

    
apropoz 03.08.2010 11:24
quelle

Tags und Links