Was ist der Unterschied zwischen == und equal() in C#

高洛峰
Freigeben: 2016-12-16 10:28:46
Original
1208 Leute haben es durchsucht

Zum Beispiel der folgende Code:

int age = 25;
 
short newAge = 25;
 
Console.WriteLine(age == newAge);  //true
 
Console.WriteLine(newAge.Equals(age)); //false
 
Console.ReadLine();
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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;
 
   }
Nach dem Login kopieren



Weitere verwandte Artikel zum Unterschied zwischen == und equal() in C# finden Sie auf der chinesischen PHP-Website!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage