Question

Lorsque j'implémente des objets que je souhaite comparer à l'aide de l'élément IEquatable<T> interface :

  1. Pourquoi dois-je remplacer la Equals(object) méthode si j'ai déjà implémenté Equals(T)?
  2. Puis-je utiliser les opérateurs == et != après avoir implémenté <=>?
Était-ce utile?

La solution

  1. De MS Article de Google Documents sur IEquatable<T> :

      

    Si vous implémentez Equals(Object), vous devez également remplacer le   implémentations de classe de base de   GetHashCode() et   Equals(T) pour que leur comportement soit   cohérent avec celui de la   Equals(Object, Object)   méthode. Si vous annulez   op_Equality votre   implémentation surchargée est également   appelé dans les appels à la statique   op_Inequality   méthode sur votre classe. En outre,   vous devriez surcharger le <=>   et <=> opérateurs.   Cela garantit que tous les tests d'égalité   retourner des résultats cohérents.

  2. Non, les opérateurs n'utilisent pas la méthode Equals . Ils doivent être surchargés séparément faire ainsi.

Autres conseils

1) Comme l'a dit Ray, remplacez Equals(object) pour assurer la cohérence lorsque la méthode est appelée à partir de classes qui ne savent pas (de manière statique) que vous implémentez IEquatable<T>. Par exemple, les classes de collections non génériques utiliseront GetHashCode() pour les comparaisons. Vous devez également remplacer System.String.

2) L'implémentation de <=> ne surcharge pas automatiquement les opérateurs == et! =, mais rien ne vous en empêche, tout comme le fait <=>. Vous devez cependant documenter cela très clairement si vous le faites - et soyez prudent lorsque vous effectuez des comparaisons entre d'autres types de référence (par exemple, MyType et Object) qui continueront à utiliser la comparaison d'identité. Je suppose que ce n’est pas une bonne idée de faire cela à moins que ce ne soit un type très utilisé dans votre code, où tout le monde en deviendra très familier et où le sucre syntaxique de surcharge == sera vraiment avoir un impact positif sur la lisibilité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top