(Objekt) 0 == (Objekt) 0

7

Ich frage mich, warum in C #

%Vor%

Für mich sieht es so aus, als ob es die Referenz vergleicht, anstatt den Wert der Besetzung zu vergleichen.

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, gibt es zurück, dass beide nicht gleich sind, sondern denselben Wert haben / p>

Die Verwendung von Equals oder ToString funktioniert beim ValueType-Objekt, nicht jedoch bei 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 einem beliebigen Typ sein können, null oder mit einem Wert, da object == Objekt der falsche Weg zu sein scheint. Müssen Sie meine Objekte in ihren ursprünglichen Typ umwandeln? In diesem Fall wird der ReferenceType immer anders aussehen?

    
lucian.jp 05.06.2009, 19:01
quelle

5 Antworten

25

Ja, es ist das Boxen beider Seiten und das Vergleichen der Referenzen. Bei jeder Box erstellen Sie ein neues Objekt, so dass die Referenzen unterschiedlich sind.

Der Vergleich mit der Equals -Methode ist der Weg, unter Berücksichtigung der Nichtigkeit. Am einfachsten ist es, die statische Methode object.Equals(object, object) zu verwenden:

%Vor%     
Jon Skeet 05.06.2009, 19:04
quelle
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.

    
n8wrl 05.06.2009 19:04
quelle
0

Im Grunde genommen erzeugt das Obige zwei Objektreferenzen, speichert sie an verschiedenen Stellen im Speicher und vergleicht dann die Speicheradressen. Dies wird jedes Mal aus diesem Grund falsch zurückgegeben.

Die einzige Möglichkeit, zwei mir bekannte Objekte 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 null zu bestimmen == null). Wenn keine der beiden Nullen ist, können Sie .equals für das Objekt sicher aufrufen.

    
ristonj 05.06.2009 19:07
quelle
0

Der Cast wird das Boxen erzwingen, was im Wesentlichen neue Objekte erzeugt, und dann werden die Referenzen verglichen. Wenn Sie die Objekte stattdessen nach Inhalt vergleichen möchten (mithilfe des implementierten Vergleichs der Objekte, auf die die Verweise zeigen), sollten Sie die Equals-Methode verwenden:

%Vor%     
Fredrik Mörk 05.06.2009 19:09
quelle
0

Dies kann die Dinge ein wenig klären.

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

    
quillbreaker 05.06.2009 19:25
quelle

Tags und Links