2012-03-03 15 views
21

según msdnIStructuralEquatable vs Equals?

IStructuralEquatable

define métodos para apoyar la comparación de objetos para estructural igualdad. La igualdad estructural significa que dos objetos son iguales porque tienen valores iguales. Difiere de la igualdad de referencia, que indica que dos referencias de objetos son iguales porque hacen referencia a el mismo objeto físico.

¿No es esto lo que Equals debería hacer? (al anular IEquatable)?

+0

@CodeInChaos De mi lectura - es solo para tipos compuestos (que contiene algunos elementos) .... ¿verdad? - de lo contrario - si fuera solo un objeto - podría haber implementado igual a ....? –

+1

Según tengo entendido, se utiliza para recopilar tipos similares y encapsula la parte estructural de la comparación, pero deja la comparación de los elementos a un comparador que el usuario transfiere. Pero no estoy muy seguro de si realmente lo tengo. – CodesInChaos

+0

http://stackoverflow.com/a/5601068/445517 Pero creo que la respuesta aceptada sigue siendo (afirmó haberlo corregido) incorrecta/no entendiendo el punto de 'IStructuralEquatable'. – CodesInChaos

Respuesta

2

La razón por la que necesita el IStructuralEquatable es para definir una nueva forma de comparación que sería adecuada para todos los objetos.

La interfaz IStructuralEquatable le permite implementar personalizadas comparaciones para comprobar la igualdad estructural de recogida de objetos . Es decir, puede crear su propia definición de igualdad estructural y especificar que esta definición se use con un tipo de colección que acepte la interfaz IStructuralEquatable.

Por ejemplo, si desea una lista que clasifique todos sus elementos por una definición específica. En este caso, no desea cambiar la implementación de su clase, por lo que no debe anular el método Equals.

esto definirá una forma general de comparar objetos en su aplicación.

0

El contrato de Equals difiere del de IStructuralEquatable, en que indica si 2 objetos son lógicamente iguales.

De manera predeterminada, Igual a un tipo de referencia indica si dos referencias de objeto hacen referencia a la misma instancia de objeto. Sin embargo, puede anular Equals según la lógica de su aplicación.

Como ejemplo, podría tener sentido que dos instancias diferentes de una clase Employee se consideren iguales si ambas representan la misma entidad en su sistema. Para lograr esto, los objetos de empleados con propiedades SSN coincidentes se tratarían como lógicamente iguales, incluso si no fueran estructuralmente iguales.

+4

Er ... si quiere una equivalencia * lógica *, anula 'Object.Equals (Object other)'. Si desea una equivalencia * referencial *, simplemente no la anule.Si tiene una 'struct', y quiere una comparación * logical * (que casi siempre hace), anula ese método, y también implementa' IEtabletable .Equals (T other) '. ¿Pero por qué necesitarías alguna vez 'IStructuralEquatable'? – Mehrdad