Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Unterschiede zwischen equal und == in C#

Was sind die Unterschiede zwischen equal und == in C#

高洛峰
高洛峰Original
2016-12-16 10:30:261633Durchsuche

In C# gibt es zwei verschiedene Arten von Gleichheit: Referenzgleichheit und Wertegleichheit.


◎Wertgleichheit ist Gleichheit im allgemein verstandenen Sinne: Sie bedeutet, dass zwei Objekte den gleichen Wert enthalten.
◎Referenzgleichheit bedeutet, dass nicht zwei Objekte verglichen werden, sondern zwei Objektreferenzen, und beide beziehen sich auf dasselbe Objekt.

Gleich:


In der folgenden Anweisung stellen x, y und z Objektverweise dar, die nicht null sind.

* x.Equals(x) gibt true zurück, außer wenn Gleitkommatypen beteiligt sind.
* x.Equals(y) gibt den gleichen Wert zurück wie y.Equals(x).
* x.Equals(y) gibt true zurück, wenn sowohl x als auch y NaN sind.
* (x.Equals(y) && y.Equals(z)) gibt genau dann true zurück, wenn x.Equals(z) true zurückgibt.
* Aufeinanderfolgende Aufrufe von x.Equals(y) geben denselben Wert zurück, solange die durch x und y referenzierten Objekte nicht geändert werden.
* x.Equals(null) gibt false zurück.

==:


Für vordefinierte Werttypen gibt der Gleichheitsoperator (==) true zurück, wenn die Werte der Operanden gleich sind, andernfalls false.

Für andere Referenztypen als String gibt == true zurück, wenn beide Operanden auf dasselbe Objekt verweisen.
Bei String-Typen vergleicht == String-Werte.

Der Unterschied zwischen Gleich und ==

"==": Die Operation vergleicht, ob die Werte zweier Variablen gleich sind. Für Referenzvariablen bedeutet dies, dass die beiden Die Variablen befinden sich auf dem Heap, ob die darin gespeicherten Adressen identisch sind, dh ob der Inhalt des Stapels identisch ist.

"gleich": Ob sich die beiden durch die Operation dargestellten Variablen auf dasselbe Objekt beziehen, dh ob der Inhalt im Heap gleich ist.
Der String ist ein spezieller Referenztyp. In der Sprache C# sind viele Methoden des String-Objekts (einschließlich der Methode equal()) überladen, sodass das String-Objekt wie ein Werttyp verwendet wird.
Instanz

C#-Code

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
namespace ConsoleApplication1
 {
     class Person
     {
         private string name;
         public string Name
         {
             get { return name; }
             set { name = value; }
         }
         public Person(string name)
         {
             this.name = name;
         }
     }
     class program
     {
         static void Main(string[] args)
         {
             string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
             string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
             Console.WriteLine(a == b);
             Console.WriteLine(a.Equals(b));
             object g = a;
             object h = b;
             Console.WriteLine(g == h);
             Console.WriteLine(g.Equals(h));
             Person p1 = new Person("jia");
             Person p2 = new Person("jia");
             Console.WriteLine(p1 == p2);
             Console.WriteLine(p1.Equals(p2));
             Person p3 = new Person("jia");
             Person p4 = p3;
             Console.WriteLine(p3 == p4);
             Console.WriteLine(p3.Equals(p4));
             Console.ReadLine();
         }
     }
 }

Ausgabeergebnis

wahr, wahr, falsch, wahr, falsch, falsch, wahr, wahr.

Die Zusammenfassung lautet wie folgt:


1. Bei Werttypen sind == und equal gleichwertig und vergleichen beide den Inhalt der gespeicherten Informationen.
2. Bei Referenztypen vergleicht == die Adresse des Referenztyps im Stapel, während die Methode equal den Inhalt der Speicherinformationen des Referenztyps im verwalteten Heap vergleicht.
3. Die String-Klasse benötigt eine besondere Behandlung. Es handelt sich um eine Klasse, die die Methode „equals“ und „==“ bereits intern verarbeitet hat. Daher sind „==“ und „equals“ gleichwertig und vergleichen beide den Inhalt der gespeicherten Informationen.
4. Bei einigen benutzerdefinierten Klassen müssen wir die Equals-Methode überladen, andernfalls wird standardmäßig die Equals-Methode der Basisklasse verwendet (wenn die Basisklasse die Equals-Methode nicht überlädt, ist es die Equals-Methode in der Object-Klasse ). Ihr Vergleich Auch für Adressen statt Referenztypen, die Informationen im verwalteten Heap speichern.


Weitere verwandte Artikel zu den Unterschieden zwischen equal und == in C# finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
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