2010-09-07 15 views
6

Estoy tratando de entender para qué se usa object.GetHashCode(). Leí que las colecciones lo usan para identificar claves de manera única. Pero quería probar esto y el resultado no es el esperado.¿Por qué importar GetHashCode()?

struct Animal 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public Animal(string name, int age) : this() 
    { 
     Name = name; 
     Age = age; 
    } 

    public override int GetHashCode() 
    { 
     return Age.GetHashCode(); 
    } 
} 

object doggy = new Animal("Dog", 25); 
object cat = new Animal("Cat", 25); 

Hashtable table = new Hashtable(); 
table.Add(doggy, "Dog"); 
table.Add(cat, "Cat"); 

Console.WriteLine("{0}", table[cat]); 
Console.WriteLine("{0}", table[doggy]); 

lo que habría esperado "gato" sobreescribiría "perro" o algún tipo de error que me dice que la "clave ya existe", pero la salida es

"gato" "perro"

+3

btw - no está relacionado con la pregunta, pero 'struct' es una opción muy pobre para este escenario. Si tiene dudas, use 'clase'. Si no está en duda, probablemente todavía use 'clase'. Es * extremadamente * raro para (válidamente) declarar una 'estructura' en C#. –

+0

Sí, estoy de acuerdo, en realidad la prueba fue originalmente con clase, pero traté de reemplazar a struct para ver si hacía diferencia :) –

Respuesta

12

GetHashCode es sólo el primer cheque, que se utiliza para determinar la igualdad y la no posible igualdad. Después de eso, Equals está marcado. Lo cual para los objetos predeterminados para reference-equality, y para structs es una comparación memberwise. Omita Equals para dar una implementación apropiada (emparejada con el código hash), y debe dar los resultados que espera (clave duplicada).

por cierto, el IDE es, probablemente, ya que le da una advertencia de que GetHashCode y Equals deben ser tratados siempre juntos ...

+0

Como una adición, MSDN dice: "Las clases derivadas que reemplazan a GetHashCode también deben anular Igual para garantizar que dos los objetos considerados iguales tienen el mismo código hash, de lo contrario, el tipo Hashtable podría no funcionar correctamente ". http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx –

2

códigos hash se utilizan como una primera verificación para dividir los objetos en grupos. Si una colección contiene el código hash de cada elemento, puede buscar un elemento buscando primero elementos cuyo código hash coincida con el del elemento buscado. Una vez que encuentra uno o más de esos artículos, puede examinarlos con más detalle. Idealmente, los objetos que no son iguales siempre devolverían diferentes códigos hash, pero eso no es práctico. Si los objetos que no son iguales devuelven códigos hash idénticos, puede ser necesario examinarlos en detalle cada vez que se busque uno de ellos.

Cuestiones relacionadas