2009-06-05 18 views
7

mi chiedo il motivo per cui in C#(oggetto) 0 == (oggetto) 0

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

A me sembra che confronta il riferimento invece di confrontare il valore del cast.

questo è venuto a me, perché con la riflessione Mi è toccato il valore di default di ValueType che restituiscono un oggetto e quando sto paragonando a valore corrente del mio oggetto restituisce che entrambi non sono gli stessi, ma hanno lo stesso valore.

L'utilizzo di Equals o ToString funziona sull'oggetto ValueType ma non con ReferenceType che può essere nullo e pertanto non consente Equals o ToString.

Se qualcuno potrebbe dirmi come posso confrontare un oggetto diverso che può essere di qualsiasi tipo, null o con un valore dato che oggetto == oggetto sembra essere la strada sbagliata da percorrere. Sono obbligato a rielaborare i miei oggetti nel loro tipo originale in questo caso il ReferenceType sarà sempre diverso?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx (riferimento al box) – meandmycode

risposta

25

Sì, è inscatolare entrambi i lati e confrontare i riferimenti. Ogni volta che crei un nuovo oggetto, i riferimenti sono diversi.

Il confronto con il metodo Equals è la strada da percorrere, tenendo conto della nullità. Il modo più semplice è quello di utilizzare il metodo statico object.Equals(object, object):

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

Sei boxe, quindi il "cast" in realtà crea un NUOVO oggetto per ognuno. Se stai confrontando il tuo oggetto potresti dover scrivere la tua implementazione .Equals.

0

Fondamentalmente, quanto sopra è creare due riferimenti a oggetti, la loro memorizzazione in posizioni diverse nella memoria, quindi confrontando gli indirizzi di memoria. Ciò restituirà false ogni volta per quel motivo.

L'unico modo per confrontare due oggetti che conosco è verificare se uno o entrambi gli oggetti sono nulli (se uno è nullo e non l'altro, non sono uguali; lo lascio alla tua implementazione per determinare se null == null). Se nessuno dei due è nullo, è possibile chiamare tranquillamente .equals sull'oggetto.

0

Il cast forza la boxe, che essenzialmente crea nuovi oggetti, quindi i riferimenti vengono confrontati. Se si desidera confrontare gli oggetti in base al contenuto, invece (utilizzando il confronto realizzato degli oggetti che i riferimenti puntano a), si dovrebbe utilizzare il metodo Equals:

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

Questo può chiarire le cose un po '.

oggetto zero = (oggetto) 0; return (oggetto.Equals (zero, zero)); // restituisce true

Problemi correlati