2009-08-03 5 views

Antwort

26

Siehe guidelines for overriding Equals() and operator==.

Zitat:

standardmäßig der Operator == Tests als Referenz Gleichheit durch die Bestimmung, ob zwei Referenzen auf das gleiche Objekt zeigen. 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.

Grundsätzlich:

Wenn Sie == und wollen = verhalten wie Equals(..) und !Equals(..) Sie müssen die Betreiber implementieren. Sie tun das normalerweise nur mit unveränderlichen Typen.

+1

+1 Sehr klar und prägnant. –

1

Wenn Sie die equals-Methode überschreiben und trotzdem auf Gleichheit (oder Ungleichheit) prüfen möchten, sollten Sie wahrscheinlich auch die Methoden == und! = Überschreiben.

1

Es ist nicht notwendig, aber eine kluge Sache zu tun.

Wenn Sie ein Framework erstellen und ein anderer Entwickler als Sie das Objekt verwenden möchten, sollten Sie das == und! = Überschreiben. Auf diese Weise haben Entwickler, wenn sie sie benutzen, zumindest die richtige Logik, um die 2 Objekte zu vergleichen und nicht nur die gleichen im Speicher.

Ich würde sicherstellen, dass Ihre == &! = Rufen Sie Ihre equals-Methode.

5

Siehe Guidelines for Implementing Equals and the Equality Operator (==)

Für Werttypen (structs) „Implementieren == jedes Mal, wenn die Equals-Methode überschreiben“

Für Referenztypen (Klassen): „Die meisten Referenztypen, auch solche, die die Equals implementieren Methode, sollte nicht überschreiben ==. " Die Ausnahme ist für unveränderliche Klassen und solche mit wertähnlicher Semantik.

1

Es wäre ratsam, da es unerwartet wäre, wenn:

if (foo == bar) 

... verhielt sich anders:

if (foo.Equals(bar)) 
+1

Es gibt viele Fälle, in denen sich 'foo == bar' anders verhält als' foo.Equals (bar) '. Ein Irrglaube an ihre Äquivalenz kann leicht zu Problemen führen als die Erkenntnis, dass sie sich nicht immer gleich verhalten können und nicht erwartet werden [tatsächlich hat der Rahmen einige Ungereimtheiten in dem, was "Gleich" bedeutet, die aus einem unmotivierten Wunsch resultieren mach es passend zu '==']. – supercat

+0

@supercat ein gutes Beispiel ist, wenn nullwertfähige Typen verglichen werden, Equals ist smart und prüft HasValue für jede Seite. – Gary

+0

@Gary: Ich dachte mehr an Dinge wie 'Decimal'. Es ist nützlich, ein Mittel zum Vergleich zu haben, das bewertete Objekte als gleich betrachtet, wenn keines über dem anderen liegt, aber es ist auch nützlich, ein Mittel zur Gleichheitsprüfung zu haben, das gleichrangige Objekte (z. B. 1,0d und 1,00d) als verschieden erkennen kann. IMHO, solche Objekte sollten zu entgegengesetzten Vergleichsergebnissen mit '==' und '.Equals' führen. – supercat

1

Es ist nicht notwendig, niemand wird dich töten, wenn Sie dies nicht tun TU das.

Beachten Sie jedoch, dass es oft natürlicher ist, (A == B) als A.Equals (B) zu schreiben. Wenn Sie beide Methoden bereitstellen, wird es für die Verbraucher Ihres Codes einfacher.

2

Zusätzlich zu allen Antworten bereits hier, vergessen Sie nicht sicherzustellen, GetHashCode() ist auch konsistent.

1

in A.Gleich (B) A kann nicht null sein in A == B kann entweder null sein

1

Überschreiben == um es aufzurufen Gleiches erscheint mir als eine generell schlechte Idee für Referenztypen. Wenn Sie == überschreiben, damit Equals aufgerufen wird, gibt es für einen Benutzer Ihres Codes keine Möglichkeit, zu testen, ob sich zwei Objektreferenzen auf genau dasselbe Objekt beziehen (gegenüber einem Objekt mit gleichen Eigenschaften).

Wenn Benutzer Instanzen Ihrer Klassen für Wertgleichheit testen möchten, dann sollten sie einfach Equals aufrufen und == zum Testen der Referenzgleichheit speichern.

+1

Sie können 'Object.ReferenceEquals' verwenden, um die Referenzgleichheit zu überprüfen. –

+0

Aha, danke Sebastian - davon wusste ich nichts. –

+1

Obwohl es möglich ist, 'Object.ReferenceEquals' zu verwenden, ist es ziemlich klobig. Ich betrachte die C# -Benutzung des '==' -Tokens sowohl für die Overlaidable-Equality-Test- als auch für die Referenz-Equality-Test-Operatoren als einen der größten Designfehler in der Sprache. – supercat

Verwandte Themen