2010-03-01 17 views

Antwort

15

Nun, == kann für Referenztypen überladen werden. Beispiel:

Wenn es nicht überladen ist, bedeutet == "Referenzgleichheit" aka "Objektidentität" für Referenztypen. (Wie Marc sagt, können Sie Equals ohne Überladung == überschreiben.)

Für Werttypen müssen Sie überladen == sonst wird der C# -Compiler Sie nicht für Vergleiche verwenden. .NET selbst wird eine Implementierung von Equals bieten, die normalerweise das Richtige tut, aber manchmal langsam - in den meisten Fällen, wenn Sie Ihren eigenen benutzerdefinierten Werttyp schreiben, wollen Sie auch IEquatable<T> implementieren und Equals überschreiben - und möglicherweise überladen Sie verschiedene Betreiber.

8

C# ermöglicht es dem Bediener == werden überlastet (und die Equals Methode überschrieben werden - obwohl == und Equals nicht das Gleiche zu bedeuten haben).

Wenn Sie "die gleiche Instanz" meinen wollen, dann ist object.ReferenceEquals (für Referenztypen) die beste Option. Werttypen haben standardmäßig die interne Gleichheit.

2

Gerade aus MSDN:

Bei vordefinierten Wertetypen, die Gleichheitsoperator (==) liefert true, wenn die Werte der Operanden gleich sind, andernfalls false. Bei Referenztypen anders als string, gibt == true zurück, wenn seine beiden Operanden auf dasselbe Objekt verweisen. Beim String-Typ vergleicht == die Werte der Strings.

Jon Skeet sollte in der Lage sein, Ihnen eine perfekte Antwort zu geben, aber: P

+0

Er hat dich schon geschlagen! – leppie

+0

Ja, er hat mich um 46 Sekunden geschlagen! Ich wusste, während ich meine Antwort schrieb, dass Jon eine sehr gute Antwort geben würde. – Kelsey

0

Das ist genau so, wie es auch mit .NET funktioniert. Die C# FAQ blog explains equals better:

Die Equals-Methode ist nur ein virtuelles ein in System.Object definiert und außer Kraft gesetzt durch Unabhängig davon, welche Klassen wählen, dies zu tun. Der Operator == ist ein Operator , der von Klassen überlastet werden kann, aber normalerweise Identitätsverhalten hat.

Für Referenztypen, bei denen == nicht überlastet wurde, vergleicht sie, ob zwei Referenzen auf dasselbe Objekt beziehen - das ist genau das, was die Implementierung von Equals tut in System.Object.

Verwandte Themen