2009-04-30 10 views
15

in C# Was passiert genau im Hintergrund, wenn Sie einen Vergleich mit dem Operator "==" an zwei Objekten vornehmen? vergleicht es nur die Adressen? oder verhält es sich ähnlich wie Equals() oder CompareTo()?C# Was macht der == Operator im Detail?

PS: Was ist mit dem Operator "==" in Java? verhält es sich genauso?

+0

Nur eine kurze Info: Wenn Sie == überlasten, müssen Sie auch implementieren =!. Das gleiche gilt für <= and > =. – Tarik

Antwort

24

Soweit ich weiß:

  • es Werttypen von Wert vergleicht (Gleichheit)
  • es Referenztypen durch Bezugnahme (Identität)
  • außer wenn der Operator == überlastet ist, vergleicht dann Das nennt man das.

Equals ist im Objekt implementiert und kann auch überschrieben werden. Die Standardimplementierung in Object führt einen Referenzvergleich für Referenztypen durch. Standardmäßig tun Equals und == dasselbe.

Ich denke, in Java können Sie den == Operator nicht überladen. Aber mein Java-Wissen ist ziemlich veraltet.

Bearbeiten: Beachten Sie, dass der Operator == eine statische Methode ist. Es wird zur Kompilierzeit gebunden, basierend auf den Typen Ihrer Variablen oder Felder. Equals ist eine virtuelle Methode, die zur Laufzeit auf der Grundlage tatsächlicher Laufzeittypen gefunden wird.

+3

Ausgezeichnete Antwort; mindestens eine Unterlassung, obwohl: http://stackoverflow.com/questions/806020/snip/806068#806068 –

+0

Sie nicht überschreiben können == Operator in Java, für Referenztypen in Java == wird immer eine Referenz (Identität) Vergleich. –

+1

Sie können Operatoren in C# nicht überschreiben, da sie nicht virtuell sind. Sie können sie nur überlasten. –

4

From MSDN:

Bei vordefinierten Wertetypen, die Gleichheitsoperator (==) liefert true, wenn die Werte der Operanden gleich sind, andernfalls false. Bei Referenztypen , die keine Zeichenfolge sind, gibt == true zurück, wenn seine beiden Operanden auf dasselbe Objekt verweisen. Beim String-Typ vergleicht == die Werte der Strings.

3

Nein ... Der Operator == verhält sich in java und in C# nicht immer gleich.

Zum Beispiel mit Strings; Java == vergleicht die Referenzen der String-Objekte ... (wenn Sie Primitiv-Typen verwenden, vergleicht == in Java die Werte). Deshalb

// returns FALSE in JAVA 
(new String("test") == "test") 

wird in Java nicht true zurück ...

In C# dagegen wird der Operator == anders auf Strings verhalten. Zum Beispiel wird es im folgenden Fall true zurück:

// returns TRUE in C# 
(new String("test".ToCharArray()) == "test") 
+0

Dies liegt daran, dass der Operator == nicht in Java, sondern in C# überschrieben werden kann, und das ist es für Strings. Macht dies das Verhalten des Bedieners anders? –

+0

Ich denke, das ist ein üblicher Fall, wenn Sie gewohnt sind, Software in C# zu schreiben und dann Java in einem anderen Projekt zu verwenden ... deshalb wollte ich es aufzeigen – Homes2001

9

Als Erweiterung Stefan's excellent answer - ein weitere Ausnahme ist, wenn die Operanden Nullable<T> beinhalten - in diesem Fall „abgehoben“ Betreiber (14.2.7 in ECMA 334v4):

Für die Gleichheitsoperator == =

eine erweiterte Form eines Operators besteht, wenn die Operandentypen beiden Nicht-Nullable-Wertetypen und wenn der Ergebnistyp sind! ist bool. Das aufgehobene Formular wird konstruiert, indem man ein einzelnes hinzufügt? Modifikator für jeden Operandentyp. Der Operator aufgehoben berücksichtigt zwei null Werte gleich und einen Nullwert ungleich zu einem beliebigen Wert ungleich Null. Wenn beide Operanden ungleich null sind, entpackt der abgehobene Operator die Operanden und wendet den zugrunde liegenden Operator auf an, um das bool-Ergebnis zu erzeugen.

Was das bedeutet, ist: weil es ein Gleichheitsoperator zwischen (sagen wir) ist:

int i = ..., j = ...; 
bool eq = i == j; 

So gibt es eine implizite Betreiber der Form (obwohl anders gemacht):

int? i = ..., j = ...; 
bool eq; 
if(i.HasValue) { 
    if(j.HasValue) { // both have values; compare 
     eq = i.GetValueOrDefault() == j.GetValueOrDefault(); 
    } else { // one null; always false 
     eq = false; 
    } 
} else { // true if both null, else false 
    eq = !j.HasValue; 
} 
0

Das Verhalten des Operators == hängt davon ab, wie die Variable, auf die Sie es anwenden, deklariert wurde (nicht die Klasse des Objekts, ich füge ein Beispiel hinzu).

Für Werttypen werden ihre Werte verglichen.

Für Referenztypen a == b gibt true zurück, wenn a dasselbe Objekt wie b ist, es sei denn, der Operator == wurde überladen. Nicht überschrieben, wie andere sagten, Sie können Operatoren in C# nicht überschreiben, weil sie nicht virtuell sind.

object obj_a, obj_b; string str_a, str_b;

 str_a = "ABC"; 
     str_b = new string("ABC".ToCharArray()); 
     obj_a = str_a; 
     obj_b = str_b; 

     Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded 
     Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals 
     Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded 
     Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed. 
     Console.ReadKey(); 

Die Ausgabe dieses Programms ist

 
str_a == str_b = True 
str_a.Equals(str_b) = True 
obj_a == obj_b = False 
obj_a.Equals(obj_b) = True