Beachten Sie, dass es zwei verschiedene Arten von Gleichheit in C# gibt
1- Value Equality
(Für Werttypen wie int, DateTime und struct)
2- Reference Equality
(Für Objekte)
Es gibt zwei grundlegende Standardprotokolle für die Durchführung von Gleichheitsprüfungen.
1- Die ==
y !=
Betreiber.
2- Die virtual
Equals
méthode.
Die == und != sind statisch aufzulösen, was bedeutet, dass C# zur Kompilierzeit eine Entscheidung trifft, welcher Typ den Vergleich durchführen soll.
Zum Beispiel die value-type
int x = 50;
int y = 50;
Console.WriteLine (x == y); // True
sondern für reference type
object x = 50;
object y = 50;
Console.WriteLine (x == y); // False
En Equals()
ursprünglich zur Laufzeit nach dem tatsächlichen Typ des Operanden aufgelöst.
Im folgenden Beispiel wird beispielsweise zur Laufzeit entschieden, dass die Equals()
auf int-Werte angewendet wird, ist das Ergebnis true
.
object x = 5;
object y = 5;
Console.WriteLine (x.Equals (y)); // True
Bei einem Referenztyp wird jedoch eine Referenzgleichheitsprüfung durchgeführt.
MyObject x = new MyObject();
MyObject y = x;
Console.WriteLine (x.Equals (y)); // True
Beachten Sie, dass Equals()
verwendet den Strukturvergleich für struct
d.h. es ruft Equals für jedes Feld einer Struktur auf.
4 Stimmen
Siehe auch: stackoverflow.com/questions/144530/or-equals
19 Stimmen
String-Überschreibungen
==
, aber die Operatoren sind nicht polymorph. In diesem Code ist die==
Operator wird für den Typobject
die einen Identitätsvergleich anstelle eines Wertevergleichs durchführt.25 Stimmen
Um den Kommentar von @DrewNoakes zu ergänzen: Der Compiler wählt eine
==
Überladung auf der Grundlage des Kompilierzeittyps der Operanden. DieContent
Eigenschaft istobject
. Operatoren sind nicht virtuell, so dass die Standardimplementierung von==
aufgerufen wird, was einen Vergleich der Referenzgleichheit ergibt. Bei Equals geht der Aufruf an die virtuelle Methodeobject.Equals(object)
;string
überschreibt diese Methode und führt einen ordinalen Vergleich mit dem String-Inhalt durch. Siehe msdn.microsoft.com/de-us/library/fkfd9eh8(v=vs.110).aspx y referencesource.microsoft.com/#mscorlib/system/string.cs,507 .8 Stimmen
Die Erklärung von @phoog ist präzise. Es sollte beachtet werden, dass, wenn die linke Seite von
==
hat zur Kompilierzeit den Typobject
und die rechte Seite hat zur Kompilierzeit den Typstring
dann muss der C#-Compiler die (in diesem Fall problematische) Überladungoperator ==(object, object)
; aber es wird eine Warnung zur Kompilierzeit ausgeben, dass dies unbeabsichtigt sein könnte. Also lesen die Kompilierzeit-Warnungen! Um das Problem zu beheben und trotzdem==
die linke Seite zustring
. Wenn ich mich richtig erinnere, schlägt der Warntext genau das vor.2 Stimmen
@JeppeStigNielsen +1 für den Hinweis, Compiler-Warnungen zu lesen. Noch besser: Schalten Sie die Option "Warnungen als Fehler" ein, um jeden zu zwingen, sie zu beachten.
0 Stimmen
Dies liegt an der Gleichheit der Werte (Methode equal) und der referenziellen Gleichheit (Operator ==), da die Methode equal die Werte prüft, während der Operator == die Referenz prüft.