Zum Beispiel der folgende Code:
int age = 25; short newAge = 25; Console.WriteLine(age == newAge); //true Console.WriteLine(newAge.Equals(age)); //false Console.ReadLine();
int und short sind primitive Typen, aber der Vergleich mit „==" gibt true zurück und equal() gibt false zurück. Warum?
Antworten:
Kurz gesagt:
„equals()“ ist komplizierter als „==".
Im Einzelnen:
Der ursprüngliche Typ überschreibt object.Equals(object) der Basisklasse und gibt true zurück, wenn das Objekt in den Klammern mit seinem Typ und Wert übereinstimmt (beachten Sie die Nullable). Typ Auch für die obige Beurteilung geeignet; nicht leere Nullable-Typen werden immer in eine Instanz des zugrunde liegenden Typs eingebettet.
Da newAge kurz ist, gibt newAge.Equals(object) true zurück, wenn das Objekt kurz ist und der Wert gleich dem newAge-Wert ist. Was Sie übergeben, ist ein int-Objekt, daher wird „false“ zurückgegeben.
Im Gegensatz dazu ist der „=="-Operator als eine Operation mit zwei Ganzzahlen (int) oder zwei kurzen Ganzzahlen (short) oder zwei langen Ganzzahlen (long) definiert. Wenn die beiden Parameter von „==“ eine Ganzzahl und eine kurze Ganzzahl sind, konvertiert der Compiler implizit short in int und vergleicht die Größe des konvertierten int-Werts.
Andere Möglichkeiten, damit es funktioniert:
Primitive Typen haben auch ihre eigene equal()-Methode, equal akzeptiert Argumente desselben Typs.
Wenn Sie age.Equals(newAge) schreiben, wählt der Compiler int.Equals(int) als beste Überladungsmethode und konvertiert short implizit in int. Dann wird „true“ zurückgegeben, da diese Methode die Größe zweier int-Werte direkt vergleicht.
Short hat auch eine short.Equals(short)-Methode, aber der int-Typ kann nicht implizit in short konvertiert werden, daher wird er nicht aufgerufen.
Sie können den Aufruf dieser Methode mithilfe einer Umwandlung erzwingen:
Console.Writeline(newAge.Equals((short)age)); //true
Dadurch wird short.Equals(short) direkt aufgerufen, ohne Ladekastenbedienung. Wenn das Alter größer als 32767 ist, wird eine Überlaufausnahme ausgelöst.
Sie können auch die short.Equals(object)-Überladung aufrufen, aber Sie müssen explizit ein Boxed-Objekt desselben Typs übergeben:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
Wie bei der vorherigen optionalen Methode (short.Equals(short)) wird auch eine Überlaufausnahme ausgelöst, wenn die Größe den kurzen Bereich überschreitet. Im Gegensatz zu früheren Lösungen wird ein Objekt nur kurz verpackt – eine Verschwendung von Zeit und Speicher.
Quellcode:
Hier ist die in der Praxis verwendete Equals():
public override bool Equals(Object obj) { if (!(obj is Int16)) { return false; } return m_value == ((Int16)obj).m_value; } public bool Equals(Int16 obj) { return m_value == obj; }
Weitere verwandte Artikel zum Unterschied zwischen == und equal() in C# finden Sie auf der chinesischen PHP-Website!