2009-01-04 13 views
50

si quiero comparar objetos y su adecuación a las IEquatable <> interfaz, tengo algunas preguntas:entendimiento IEquatable

  1. ¿Por qué tengo que reemplazar equals (Object) si tengo que implementa es igual <>
  2. ¿puedo usar == y! = Una vez que implemente IEquatable?

Respuesta

50

Respecto # 1:

De MSDN:

Si implementa IEquatable<T>, también se debe anular las implementaciones de clase la base de Object::Equals(Object) y GetHashCode() por lo que su comportamiento es consistente con el del método IEquatable<T>::Equals . Si lo hace anular Object::Equals(Object), su aplicación reemplazado también llamada en llamadas al método estático Equals(System.Object, System.Object) en su clase. Esto garantiza que todas las invocaciones al método Equals() devuelven resultados consistentes.

2) No, estos hacen comparaciones de referencia y no utilizan el método Equals.

+0

por lo que cuando se trata de objetos, se supone == significa solo la misma dirección de memoria (misma instancia) – leora

+0

Bastante. Más información aquí: http://msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx –

+6

No, use ReferenceEquals() para tal fin. El operador de igualdad (==) generalmente significa lo mismo, pero puede ser anulado (por ejemplo, para cadenas y similares). –

39

1) Como dijo Ray, anule Equals(object) para garantizar la coherencia cuando se llama al método desde clases que no saben (estáticamente) que implementa IEquatable<T>. Por ejemplo, las clases de colecciones no genéricas usarán Equals(object) para realizar comparaciones. También debe anular GetHashCode().

2) La implementación de IEquatable<T> no sobrecarga los operadores == y! = Automáticamente, pero no hay nada que lo impida, al igual que System.String. Sin embargo, debe documentar esto muy claramente si lo hace, y tenga cuidado cuando haga comparaciones entre otros tipos de referencia (por ejemplo MyType y Object) que seguirán usando la comparación de identidad. Sospecho que no es una gran idea hacer esto a menos que vaya a ser un tipo muy usado en su código, donde todos se familiarizarán con él y donde el azúcar sintáctico de sobrecarga == realmente tendrá un impacto positivo en legibilidad.

+0

Jon, ¿hay alguna ganancia de rendimiento para un tipo de implementación de IEtabletable utilizado, por ejemplo, en una Colección , llamando al método Contiene? – Rauhotz

+6

Evitará el casting, sí. Para los tipos de valor, evitará el boxeo y el desempaquetado también. Consulte los documentos para Collection .Contains: utiliza EqualityComparer .Default, que utilizará la implementación de IEquatable si es posible. –

+5

Sí, no es una buena idea sobrecargar operador == y! = Para proporcionar comprobaciones de igualdad de valor (frente a la comprobación de igualdad de referencia predeterminada). La documentación de MSDN sugiere que solo lo haga por tipos inmutables. También hay problemas relacionados con las interfaces y la sobrecarga del operador. –