Frage

in c #, was genau im Hintergrund geschieht, wenn Sie auf zwei Objekten einen Vergleich mit dem „==“ Operator tun? ist es vergleichen, nur die Adressen? oder tut es so etwas wie Equals () oder CompareTo ()?

PS: was ist mit dem "==" Operator in Java? ist es das gleiche verhalten?

War es hilfreich?

Lösung

Soweit ich weiß:

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

Equals wird in Objekt implementiert und kann auch außer Kraft gesetzt werden. Die Standardimplementierung in Object führt für Referenztypen einen Referenz Vergleich. So standardmäßig Equals und == das gleiche tun.

ich glaube, in Java Sie nicht den Operator == überlasten können. Aber meine Java-Kenntnisse sind ziemlich veraltet.

Edit: Beachten Sie, dass der Operator == eine statische Methode. Es wird bei der Kompilierung, basieren auf den Typen Ihrer Variablen oder Felder gebunden. Equals ist eine virtuelle Methode, die zur Laufzeit, basierend auf dem tatsächlichen Laufzeittypen gefunden wird.

Andere Tipps

Als Erweiterung Stefans ausgezeichnete Antwort - eine weitere Ausnahme ist, wenn die Operanden Nullable<T> beinhalten - in diesem Fall "abgehoben" Betreibern (14.2.7 in ECMA 334v4):

  

Für die Gleichheitsoperator   ==! =

     

eine erweiterte Form eines Operators besteht, wenn die Operandentypen sind beide   Nicht-Nullable-Wertetypen und wenn die   Ergebnistyp ist Bool. Die erweiterte Form   wird durch Hinzufügen eines einzelnen aufgebaut?   Modifikator für jeden Operanden-Typen. Das   hob Betreiber hält zwei null   Werte gleich, und ein Nullwert ungleich   Für jeden Nicht-Null-Wert. wenn beide   Operanden sind ungleich Null, die angehoben   Operator auspackt die Operanden und   gilt die darunter liegenden Betreiber   produziert das Boolesche Ergebnis.

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

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

So gibt es einen impliziten 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;
}

Von MSDN :

  

Bei vordefinierten Wertetypen, die   Gleichheits-Operator (==) liefert true, wenn   die Werte der Operanden gleich sind,   andernfalls false. Für Referenztypen   andere als Zeichenfolge, gibt == true, wenn   seine zwei Operanden beziehen sich auf die gleichen   Objekt. Für den String-Typen, ==   vergleicht die Werte der Strings.

Nein ... der Operator == nicht immer gleich in Java und in c # verhält.

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

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

wird nicht wahr Rückkehr in java ...

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") 

Das Verhalten des Operators == hängt, wie die Variable Sie es sich bewerben erklärt wurde (nicht in der Klasse des Objekts, ich werde ein Beispiel hinzufügen).

Für Werttypen wird es ihre Werte vergleichen.

Für Referenztypen a == b liefert true, wenn ein das gleiche Objekt als b ist, es sei denn, der Operator == überlastet war. Nicht außer Kraft gesetzt, wie andere schon gesagt, Sie nicht Operatoren in c # außer Kraft setzen können, 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top