2011-07-25 32 views
7

he implementado una clase que sobrecarga las == y != operadores.Anulación de Igualdad Operadores

Esto parece funcionar bien; sin embargo, recibo la advertencia 'type' defines operator == or operator != but does not override Object.Equals(object o).

bien, así que he implementado Iguales. Pero ahora recibo la advertencia 'type' defines operator == or operator != but does not override Object.GetHashCode().

termina esto en algún momento? ¿O me he metido en un sinfín de requisitos solo porque quiero sobrecargar == y !=?

+3

corrección terminología rápida: no hace * operadores de anulación * - * que * sobrecarga de ellos. –

+1

Cuando se reemplaza 'Equals', se debe redefinir' GetHashCode' así, como se comprobará la igualdad sobre la base de una función hash. –

+0

@IgorisAzanovas No, Igual no comprobará la igualdad sobre la base de una función hash (a menos que se sobrecarga y, específicamente, codificar esa manera). La función hash está ahí para admitir colecciones hash y no se espera que genere un valor único, solo uno que idealmente se usará con poca frecuencia. – Suncat2000

Respuesta

10

termina esto en algún momento?

Sí, una vez que implemente GetHashCode finalizará. Eric Lippert tiene blogged about its importance. Todo lo que puedo hacer es que sugeriría leer y confiar en él :-)

+0

Bien, ¿alguien puede apuntar a un buen algoritmo que toma convertir un valor entero a un valor hash razonable? –

+1

@Darin ¿por qué necesitamos anular object.equals() cuando sobrecargamos el operador "=="? – Sandeep

+0

@Jonathon: si su única información de identificación es un 'int', el tipo incorporado 'int' se usa a sí mismo como su valor hash. Si es lo suficientemente bueno para ellos ... – porges

1

Sí, va a terminar cuando se reemplaza GetHashCode.

Al implementar operadores de igualdad, y además Equals, es responsabilidad del programador proporcionar una implementación para entregar un código hash personalizado para ese tipo.

Ver this MSDN reference para más detalles.

Cuestiones relacionadas