2009-06-05 14 views
7

Ich frage mich, warum in C#(Objekt) 0 == (Objekt) 0

0 == 0     // return true 
(object) 0 == (object) 0 // return false 

Für mich sieht es aus wie es die Referenz anstelle des Vergleichens des Wertes des gegossenen vergleicht.

Das kam zu mir, weil ich mit Reflection den Standardwert ValueType bekomme, der ein Objekt zurückgibt und wenn ich es mit dem aktuellen Wert meines Objekts vergleiche, dass beide nicht gleich sind, aber denselben Wert haben.

Mit Equals oder ToString arbeiten Sie am ValueType-Objekt, aber nicht mit ReferenceType, das null sein kann und daher Equals oder ToString nicht zulässt.

Wenn mir jemand sagen könnte, wie ich verschiedene Objekte vergleichen kann, die von jedem Typ sein können, null oder mit einem Wert, da Objekt == Objekt scheint der falsche Weg zu gehen. Müssen Sie meine Objekte in ihren ursprünglichen Typ umwandeln? In diesem Fall ist der ReferenceType immer anders?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx (Box-Referenz) – meandmycode

Antwort

25

Ja, es ist Boxen beide Seiten und Vergleich der Referenzen. Bei jeder Box erstellen Sie ein neues Objekt, daher sind die Referenzen unterschiedlich.

Vergleichen mit der Equals Methode ist der Weg zu gehen, unter Berücksichtigung der Nichtigkeit. Der einfachste Weg ist es, die statische object.Equals(object, object) Methode zu verwenden:

if (object.Equals(x, y)) 
{ 
    ... 
} 
4

Sie boxen, also erstellt die 'Besetzung' tatsächlich ein NEUES Objekt für jeden. Wenn Sie mit Ihrem Objekt vergleichen, müssen Sie möglicherweise Ihre eigene .Equals-Implementierung schreiben.

0

Grundsätzlich Das Obige ist die Schaffung von zwei Objektreferenzen, so dass sie in verschiedenen Positionen in dem Speicher zu speichern, dann die Speicheradressen verglichen wird. Dies wird jedes Mal aus diesem Grund falsch zurückgegeben. Die einzige Möglichkeit, zwei Objekte, die ich kenne, zu vergleichen, ist zu überprüfen, ob eines oder beide Objekte null sind (wenn eins null ist und nicht das andere, sind sie nicht gleich; ich überlasse es Ihrer Implementierung, um zu bestimmen, ob ...) null == null). Wenn keiner der beiden Werte null ist, können Sie sicher equls für das Objekt aufrufen.

0

Die Besetzung wird Boxen zwingen, die im Wesentlichen neue Objekte erstellt, und dann werden die Referenzen verglichen. Wenn Sie die Objekte, die von Inhalt statt vergleichen wollen (die implementierte Vergleich der Objekte verwenden, die die Referenzen verweisen auf), sollten Sie die Equals-Methode verwenden:

Console.Write(((object)0).Equals((object)0)); // outputs "True" 
0

Diese Dinge klären kann ein wenig.

Objekt Null = (Objekt) 0; return (object.Equals (Null, Null)); // gibt true zurück

Verwandte Themen