C #, was den Operator == tut im Detail?
-
03-07-2019 - |
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?
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")
Was sie tut, hängt vom Kontext ab.
http://en.csharp-online.net/ECMA -334: _14.9_Relational_and_type-testing_operators
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