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 primitive Typ überschreibt das Objekt „object.Equals(object)“ der Basisklasse und gibt „true“ zurück, wenn das Objekt in den Klammern mit seinem Typ und Wert übereinstimmt (beachten Sie, dass Nullable-Typen auch zu den oben genannten passen). Bestimmung; 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 Parameter 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 Umwandlungskonvertierung erzwingen:
Console.Writeline(newAge.Equals((short)age)); //true
Dadurch wird short.Equals(short) direkt aufgerufen, ohne Box-Operation. Wenn das Alter größer als 32767 ist, wird eine Überlaufausnahme ausgelöst.
Sie können auch die short.Equals(object)-Überladung aufrufen, müssen aber explizit ein Boxed-Objekt desselben Typs übergeben:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
Wie die vorherige optionale Methode (short. Equals(short)), wenn die Größe den kurzen Bereich überschreitet, wird auch eine Überlaufausnahme ausgelöst. 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!