2012-01-25 10 views
45

Me gustaría saber de la comunidad cómo debo implementar GetHashCode (o anularlo) para mi objeto. Entiendo que debo hacerlo si anulo el método igual. Lo he implementado una buena cantidad de veces, a veces simplemente llamando al método base. Entiendo que mi objeto debe ser igual a otra instancia del objeto si contiene los mismos detalles (miembros). ¿Cuál es la mejor manera de obtener un código hash de los miembros de la clase?Implementando GetHashCode correctamente

+2

Considere cerrar como duplicado de http://stackoverflow.com/a/720282/93922 –

+2

Antes de hacer esto, le recomiendo que lea y entienda mi artículo sobre él: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

Gracias, entiendo que esta puede ser una pregunta común y debería haber hecho un poco más de cacería. Gracias por su ayuda – Zivka

Respuesta

34

Digamos que su clase es el siguiente:

class Frob { 
    public string Foo { get; set; } 
    public int Bar { get; set; } 
    public double FooBar { get; set; } 
} 

Digamos que usted define es igual modo que dos instancias de Frob son iguales si su Foo y su Bar son iguales, pero FooBar no importa.

Luego debe definir GetHashCode en términos de Foo y Bar. Una forma es la siguiente:

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode(); 

Básicamente, lo que desea es incorporar todos los campos que intervienen en la definición de la igualdad. Una forma es seguir acumulando y multiplicando por 17 como lo hice. Es rápido, simple, correcto, y por lo general ofrece una buena distribución.

+5

Tengo la sensación de que esta debería ser una pregunta en sí misma, pero ¿por qué 23? –

+1

Factor primo para hacer que {2,1} y {1,2} difieran. –

+6

tal vez indique que GetHashCode solo le dice si dos objetos ** podrían ** considerarse iguales. Todavía existe la posibilidad de una colisión hash. – geofftnz