2009-04-09 17 views

Respuesta

13

Cuando anula Equals, básicamente. Cuando desea proporcionar una idea diferente de la igualdad que la igualdad de referencia simple.

La cadena es un buen ejemplo de esto: dos cadenas son iguales (en una llamada igual simple) si representan la misma secuencia de caracteres. El código hash refleja esto, de modo que si dos cadenas son iguales tendrán el mismo código hash. (A la inversa no es necesariamente cierto -. Dos cadenas desiguales puede tener el mismo código hash, pero es poco probable)

(cadenas son difíciles de otras maneras, eso sí - hay un montón de diferentes ideas de igualdad basa en la cultura y la carcasa, pero String.Equals sólo se ve en las UTF-16 puntos de código que componen la cadena, y los compara en la forma más simple concebible.)

+0

Mi colega y yo estábamos discutiendo esto hoy. Tiene mucho más sentido ahora. Gracias Jon. – RSolberg

+2

gracias a John por tan fácil entiendo la descripción. – tush1r

+0

Digamos que tengo un punto que tiene dos enteros para describir las coordenadas. ¿Cómo devolvería un _unique_ hashcod? ¿Cuál es solo un entero grande? Cuantos más datos tenga mi estructura, mayor será la posibilidad de obtener los mismos valores hash para datos completamente diferentes. ¿Sería inútil implementar esto si tuviera 7 flotantes como en una de mis estructuras (que tiene operaciones de igualdad)? –

3

Si reemplaza Equals debe invalidar GetHashCode también.

1

"El método GetHashCode puede ser anulado por un tipo derivado. Los tipos de valores deben anular este método para proporcionar una función hash que sea apropiada para ese tipo y para proporcionar una distribución útil en una tabla hash. el código debe basarse en el valor de un campo o propiedad de instancia en lugar de un campo o propiedad estática.

Los objetos utilizados como clave en un objeto Hashtable también deben anular el método GetHashCode porque esos objetos deben generar su propio código hash. Si un objeto utilizado como clave no proporciona una implementación útil de GetHashCode, puede especificar un proveedor de código hash cuando se construye el objeto Hashtable. Antes de .NET Framework versión 2.0, el proveedor de código hash se basaba en el System.Collections .. ::. IHashC interfaz odeProvider. Desde la versión 2.0, el proveedor de código hash se basa en los System.Collections interfaz .. ::. IEqualityComparer."

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

4

Si su tipo debe seguir la semántica de valor (contenido comparaban) en lugar de la semántica de referencia (comparando la identidad del objeto), usted debe escribir su propia anulación del objeto instancia. Iguales().