2013-04-23 10 views
14
Object t = 4; 
Object s = 4; 

if (t == s) {  // false 
} 

List<Object> q = new List<object>() { t }; 
Boolean found = q.Contains(s);   // found = true! 

In dem oben genannten Code bin ich nicht überrascht, t == s zurückgeben false; Es vergleicht Referenzen auf zwei Objekte und die Referenzen sind nicht identisch.Warum vergleicht Enthält Objekte anders als ==?

Aber ich bin überrascht, dass das Contains wahr ist; offensichtlich vergleicht es nicht nur Objektreferenzen, es ist als würde es die ungesicherten Werte von 4 und 4 vergleichen. Aber wie und warum weiß es, die Objekte zu entpacken, um sie zu vergleichen? Ich versuche die größere Spielpraxis hier zu verstehen.

+0

Ich glaube, '==' standardmäßig auf einen Referenzvergleich von wo die 'Objekte 'sind im Speicher, und da sie zwei verschiedene Objekte sind; Sie haben zwei verschiedene Orte im Gedächtnis. Deshalb sind sie nicht '=='. –

Antwort

5

Nach der Contains Dokumentation:

Legt fest, ob eine Sequenz unter Verwendung der Standardgleichheitsvergleich ein angegebenes Element enthält.

2

Contains verwendet Equals Methoden statt == Operator.

+3

Tatsächlich verwendet es wahrscheinlich 'EqualityComparer .Default.Equals'. – DeCaf

+0

Ich bekomme, dass eine virtuelle Equals-Methode (der "Standard-Vergleich") aufgerufen wird, um den Vergleich zu tun..aber ich stelle mir vor, die Methode in meinem Fall muss Object.Equals aufgerufen werden, da die Typen, die ich die Contains mache an sind Objekte. Und wenn das der Fall ist, wie würde Object.Equals den Inhalt auspacken und sie als Ints vergleichen? –

+0

@DeCaf 'EqualityComparer .Default' verwendet' Object.Equals' unter der Haube. – MarcinJuraszek

-1

Contains verwendet object.Equals(object), die für int s sind implementiert, so dass 4.equals(4) ist wahr. == mit Objekten auf jeder Seite verwendet nur Referenzvergleich.

Ebenfalls zu beachten: object.Equals(t, s) == true weil this method die Equals Methode der Instanz verwendet, wenn die Referenzgleichheit fehlschlägt.

7

Contains intern verwendet die Instanz object.Equals Methode, um die Elemente zu vergleichen. Es verwendet nicht den Operator ==.

Die Methode Equals ist virtuell, während == operator statisch ist. Dies bedeutet, dass der Operator == basierend auf dem Kompilierzeittyp der Variablen (und nicht das Objekt zur Laufzeit, das die Variable enthält) bestimmt, welcher Code ausgeführt werden soll. Eine virtuelle Methode ist dagegen nicht statisch gebunden. Es bestimmt, welche Überlast von Equals basierend auf dem Laufzeittyp des -Werts die Variable ausführen soll.

0

== verwendet den Typ der Variablen, um zu bestimmen, welche Gleichheit zu vergleichen ist.

Für object/object wird eine Referenzgleichheit durchgeführt.

Contains wird die Equals Methode verwendet, die virtuell ist und möglicherweise überladen wird, um einen Wertevergleich durchzuführen. In diesem Fall wird int als solches geschrieben.

+0

'==' verwendet den Typ der ** Variablen ** und ** nicht ** den Typ der Objekte, um zu bestimmen, welche Methode aufgerufen werden soll. – Servy

12

Der Ausdruck

q.Contains(s) 

sucht ein Element der q für die EqualityComparer<object>.Default.Equals(element, s) wahr ist. Bei Boxed-Primitiven vergleicht dies die Werte.

Verwandte Themen