2009-06-05 24 views
7

Me pregunto por qué en C#(objeto) == 0 (objeto) 0

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

A mí parece que compara la referencia en lugar de comparar el valor del reparto.

Esto vino a mí porque con Reflection obtengo el valor predeterminado de ValueType que devuelve un objeto y cuando lo comparo con el valor actual de mi objeto devuelve que ambos no son iguales, pero tienen el mismo valor.

El uso de Equals o ToString funciona en un objeto ValueType pero no con ReferenceType que puede ser nulo y, por lo tanto, no permite el uso de Igual o ToString.

Si alguien me puede decir cómo puedo comparar diferentes objetos que pueden ser de cualquier tipo, nulos o con un valor dado que el objeto == parece ser el camino equivocado. Me veo obligado a volver a estructurar mis objetos en su tipo original; en este caso, ¿el ReferenceType siempre será diferente?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx (referencia de boxeo) – meandmycode

Respuesta

25

Sí, encajona en ambos lados y compara las referencias. Cada vez que crea un nuevo objeto, las referencias son diferentes.

Comparando con el método Equals es el camino a seguir, teniendo en cuenta la nulidad. La forma más sencilla es utilizar el método estático object.Equals(object, object):

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

Estás boxeando, por lo que el 'reparto' realmente crea un objeto NUEVO para cada uno. Si está comparando con su objeto, es posible que deba escribir su propia implementación de .Equals.

0

Básicamente, lo anterior es la creación de dos referencias a objetos, almacenándolos en diferentes ubicaciones en la memoria, entonces la comparación de las direcciones de memoria. Esto devolverá falso cada vez por esa razón.

La única forma de comparar dos objetos que conozco es verificar si uno o ambos objetos son nulos (si uno es nulo y no el otro, no son iguales; dejo a su implementación determinar si null == null). Si ninguna de las dos es nula, puede llamar con seguridad a .equals en el objeto.

0

El yeso forzará el boxeo, que esencialmente crea objetos nuevos, y luego se compararán las referencias. Si desea comparar los objetos de contenido en lugar (mediante la comparación en práctica de los objetos que las referencias apuntan a), se debe utilizar el método Equals:

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

Esto puede aclarar un poco las cosas.

objeto cero = (objeto) 0; return (object.Equals (cero, cero)); // devuelve verdadero

Cuestiones relacionadas