c# - Comprender IEquatable
(2)
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 las comparaciones. También debe anular GetHashCode()
.
2) La implementación de IEquatable<T>
no sobrecarga los operadores == y! = De forma automática, pero no hay nada que te impida hacerlo, 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 utilizado en su código, donde todos se familiaricen con él y donde el azúcar sintáctico de la sobrecarga realmente tendrá un impacto positivo en la legibilidad.
Si quiero comparar objetos e implementan la interfaz IEquatable <>, tengo algunas preguntas:
- ¿Por qué tengo que anular Igual (objeto) si tengo que implementar Equals <>
- ¿Puedo usar == y! = una vez que implemente IEquatable?
Respecto al # 1:
Desde MSDN:
Si implementa
IEquatable<T>
, también debe anular las implementaciones de clase base deObject::Equals(Object)
yGetHashCode()
para que su comportamiento sea coherente con elIEquatable<T>::Equals
. Si reemplazaObject::Equals(Object)
, su implementación anulada también se llama en llamadas al método estáticoEquals(System.Object, System.Object)
en su clase. Esto garantiza que todas las invocaciones del métodoEquals()
devuelvan resultados consistentes.
2) No, estos hacen comparaciones de referencia y no usan el método Equals.