c# .net

c# - ¿Qué puede salir mal si uno no puede anular GetHashCode() al anular Equals()?



.net (4)

Cualquier algoritmo que use la clave no funcionará, suponiendo que se base en el comportamiento deseado de las claves hash.

Dos objetos que son Equal deben tener el mismo valor de clave hash, que no está garantizado de forma remota por la implementación predeterminada.

Posible duplicado:
¿Por qué es importante anular GetHashCode cuando se invalida el método Equals?

En C #, ¿qué puede fallar específicamente si uno no reemplaza a GetHashCode () cuando reemplaza a Equals ()?


La forma más visible es para mapear estructuras.

Cualquier clase que haga esto tendrá un comportamiento impredecible cuando se use como la Clave para un Diccionario o HashTable. La razón es que la implementación usa tanto GetHashCode como Equals para encontrar correctamente un valor en la tabla. La versión corta del algoritmo es la siguiente

  1. Tome el módulo de HashCode por el número de cubos y ese es el índice del compartimiento
  2. Llame a .Equals () para obtener la clave especificada y cada clave en el grupo en particular.
  3. Si hay una coincidencia que es el valor, ninguna coincidencia = ningún valor.

No mantener sincronizados los códigos GetHash y Equals romperá completamente este algoritmo (y muchos otros).


Piense en una estructura de hash / diccionario como una colección de cubos numerados. Si siempre pones cosas en el cubo correspondiente a su GetHashCode (), solo tienes que buscar un cubo (usando Equals ()) para ver si hay algo allí. Esto funciona, siempre que estés buscando en el cubo correcto.

Así que la regla es: si Equals () dice que dos objetos son Equal (), deben tener el mismo GetHashCode ().


Si no anula GetHashCode , cualquier cosa que compare sus objetos puede equivocarse.

Como está documentado que GetHashCode debe devolver el mismo valor si dos instancias son iguales, entonces es una prerrogativa de cualquier código que desee probar su igualdad para usar GetHashCode como primer paso para agrupar objetos que pueden ser iguales (como se sabe. que los objetos con diferentes códigos hash no pueden ser iguales). Si su método GetHashCode devuelve valores diferentes para objetos iguales, entonces pueden ingresar a diferentes grupos en la primera pasada y nunca se pueden comparar con su método Equals .

Esto podría afectar a cualquier estructura de datos de tipo de colección, pero sería particularmente problemático en los basados ​​en códigos hash, tales como diccionarios y conjuntos hash.

En resumen: siempre sobrescriba GetHashCode cuando GetHashCode Equals , y asegúrese de que sus implementaciones sean consistentes.