712 Stimmen

C# Unterschied zwischen == und Equals()

Ich habe eine Bedingung in einer Silverlight-Anwendung, die 2 Zeichenfolgen vergleicht, aus irgendeinem Grund, wenn ich verwenden == er gibt zurück falsch während .Equals() gibt zurück. wahr .

Hier ist der Code:

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
    // Execute code
}

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
    // Execute code
}

Gibt es einen Grund, warum dies geschieht?

4 Stimmen

19 Stimmen

String-Überschreibungen == , aber die Operatoren sind nicht polymorph. In diesem Code ist die == Operator wird für den Typ object 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. Die Content Eigenschaft ist object . 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 Methode object.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 .

0voto

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.

0voto

supercat Punkte 72939

En == Token in C# wird für zwei verschiedene Gleichheitsprüfungsoperatoren verwendet. Wenn der Compiler auf dieses Token stößt, prüft er, ob einer der zu vergleichenden Typen eine Überladung des Gleichheitsoperators entweder für die zu vergleichenden spezifischen Kombinationstypen (*) oder für eine Kombination von Typen, in die beide Typen konvertiert werden können, implementiert hat. Wenn der Compiler eine solche Überladung findet, wird er sie verwenden. Andernfalls, wenn die beiden Typen beide Referenztypen sind und es sich nicht um unverbundene Klassen handelt (entweder kann es sich um eine Schnittstelle oder um verwandte Klassen handeln), betrachtet der Compiler == als Referenz-Vergleichsoperator. Trifft keine der beiden Bedingungen zu, schlägt die Kompilierung fehl.

Beachten Sie, dass einige andere Sprachen getrennte Token für die beiden Gleichheitsoperatoren verwenden. In VB.NET, zum Beispiel, ist das = Token wird in Ausdrücken nur für den überladbaren Gleichheitsoperator verwendet, und Is wird als Referenztest- oder Nulltest-Operator verwendet. Ein zu verwendender = bei einem Typ, der den Gleichheitsüberprüfungsoperator nicht außer Kraft setzt, schlägt fehl, ebenso wie der Versuch, den Is zu einem anderen Zweck als der Prüfung der Gleichheit oder Nichtigkeit von Verweisen.

(*) Typen überladen im Allgemeinen nur Gleichheit für den Vergleich mit sich selbst, aber es kann für Typen nützlich sein, den Gleichheitsoperator für den Vergleich mit anderen bestimmten Typen zu überladen; zum Beispiel, int hätte einen Gleichheitsoperator für den Vergleich mit den folgenden Parametern definieren können (und IMHO auch sollen, aber nicht getan) float so dass 16777217 sich nicht mit 16777216f gleichsetzen würde. Da ein solcher Operator nicht definiert ist, wird C# die int a float und rundet sie auf 16777216f, bevor der Operator für die Gleichheitsprüfung sie sieht; dieser Operator sieht dann zwei gleiche Fließkommazahlen und meldet sie als gleich, ohne zu wissen, dass die Rundung stattgefunden hat.

-1voto

user3440463 Punkte 7

Wenn wir ein Objekt erstellen, besteht es aus zwei Teilen: dem Inhalt und dem Verweis auf diesen Inhalt. == vergleicht sowohl den Inhalt als auch die Referenz; equals() vergleicht nur den Inhalt

http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq

-2voto

Sanchit Punkte 1105

\==

Der Operator == kann zum Vergleich zweier beliebiger Variablen verwendet werden, und vergleicht er einfach die Bits .

int a = 3;
byte b = 3;
if (a == b) { // true }

Hinweis: Es gibt mehr Nullen auf der linken Seite des int, aber das interessiert uns hier nicht.

in

R

U

R

Foo a = new Foo();
Foo b = new Foo();
Foo c = a;

if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }

a

t

E

U i .

S

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X