53 votes

Comprendre IEquatable

Si je veux comparer des objets et qu'ils implémentent l'interface IEquatable <>, j'ai quelques questions:

  1. Pourquoi dois-je remplacer Equals (objet) si je dois implémenter Equals <>
  2. puis-je utiliser == et! = une fois que je mets en œuvre IEquatable?

53voto

Ray Booysen Points 10606

Sujet n ° 1:

À partir de MSDN:

Si vous implémentez IEquatable<T>, vous devriez également de remplacer le de base les implémentations de la classe de Object::Equals(Object)et GetHashCode() , de sorte que leur comportement est compatible avec celle de l' IEquatable<T>::Equals la méthode. Si vous ne remplacer Object::Equals(Object), votre substituée à la mise en œuvre est également appelé dans les appels à la statique Equals(System.Object, System.Object) méthode de votre classe. Cela garantit que toutes les invocations de l' Equals() méthode de retourner des résultats cohérents.

2) Non, ce n'plaine de référence des comparaisons et de ne pas utiliser la méthode Equals.

44voto

Jon Skeet Points 692016

1) en tant Que Ray a dit, remplacer Equals(object) afin d'assurer la cohérence lorsque la méthode est appelée à partir de classes qui ne savent pas (statiquement) que vous implémentez IEquatable<T>. Par exemple, la non-générique des collections de classes utilisera Equals(object) pour les comparaisons. Vous devriez également de remplacer GetHashCode().

2) la mise en Œuvre de IEquatable<T> ne surcharge pas l' == et != les opérateurs automatiquement, mais il n'y a rien pour vous empêcher de le faire, tout comme System.String . Vous devriez document très clairement que si vous le faites, cependant - et d'être prudent lorsque vous effectuez des comparaisons entre les autres types de référence (par exemple, MyType et de l'Objet) qui continuent d'utiliser l'identité de comparaison. Je soupçonne que c'est pas une bonne idée de le faire si ça va être très largement utilisé type dans votre code, où tout le monde va devenir très familier avec elle, et où le sucre syntaxique de la surcharge == va vraiment avoir un impact positif sur la lisibilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X