Da Microsofts aktuelle Aussage über die Gleichstellung Betreiber ==
und !=
, ist die Schlussfolgerung: ==
sollte nur syntaktischer Zucker sein für Object.Equals()
:
STELLEN SIE SICHER, dass Object.Equals und die Gleichstellung der Betreiber haben genau das gleiche Semantik
von http://msdn.microsoft.com/en-us/library/vstudio/7h9bszxx(v=vs.110).aspx
Dass sie unterscheidbar sind, anstatt nur Zucker, im Nachhinein scheint ein Fehler in ihrem Design zu sein.
Wenn Sie sicher sein wollen, erhalten Sie IDENTITY Vergleich (beim Vergleich von Referenzen), dann verwenden Sie stattdessen ReferenceEquals
.
Leider ist der Umgang mit ==
so inkonsequent, dass ich es in der Regel zu vermeiden, wenn jemand anderes benutzerdefinierte Klassen zu manipulieren, und verwenden Sie nur die weniger lesbar Equals(a, b)
oder ReferenceEquals(a, b)
, je nachdem, welche Bedeutung ich will.
IMHO, wäre es besser für Menschen, ==
und !=
überhaupt nicht zu implementieren. Lassen Sie einfach .Net standardmäßig auf Equals
und ! Equals
und implementieren Sie Equals
entsprechend.
Wenn jemand andere Argumentation hat, würde ich es gerne hören.
(Und das ist wirklich verwirrend, wenn man bedenkt, dass Java zuerst existiert und ==
bedeutet ReferenceEquals
. Aber es ist zu spät, um .Net so zu verhalten. Und wir haben Microsofts Statement zu diesem Zweck, in der Verbindung oben.)
Wenn jemand in Generika kommt, können die Unterschiede sehr groß sein, wenn man sie blind auf irgendeinen Typ T anruft. –
"blind" ist eine schlechte Praxis für alles. Wenn Sie die Antwort auf Ihre Frage wissen, warum fragen? – aku
Auch wenn ich eine konkrete Antwort kannte (was ich nicht weiß), vielleicht aus dem gleichen Grund, warum Leute Fragen stellen und sich selbst beantworten? Wie können Sie sonst noch etwas für einen generischen Typ T tun? Wenn Sie anfangen, Dinge wie if (typeof (T) == typeof (int)), was ist der Punkt? –