Je suis tombé sur ce problème récemment. Jusqu'à présent, je me contentais de remplacer l'opérateur d'égalité ( \== ) et/ou Est égal à afin de vérifier si deux types de références contiennent effectivement la même chose. données (c'est-à-dire deux instances différentes qui se ressemblent).
Je l'utilise encore plus depuis que j'ai commencé à m'intéresser aux tests automatisés (comparaison des données de référence/attendues avec celles qui sont renvoyées).
En regardant certains des directives sur les normes de codage dans MSDN Je suis tombé sur un article qui le déconseille. Je comprends maintenant pourquoi l'article dit cela (parce que ce ne sont pas les mêmes instance ) mais cela ne répond pas à la question :
- Quelle est la meilleure façon de comparer deux types de référence ?
- Devrions-nous mettre en œuvre IComparable ? (J'ai également vu que cela devrait être réservé aux types de valeurs).
- Y a-t-il une interface que je ne connais pas ?
- Devrions-nous simplement rouler le nôtre ? !
Merci beaucoup ^_^
Mise à jour
Il semble que j'ai mal lu une partie de la documentation (la journée a été longue) et que le fait d'écraser Est égal à peut être la voie à suivre
Si vous mettez en œuvre la référence vous devez envisager de remplacer la méthode Equals sur un type de référence si votre type ressemble à un type de base tel qu'un Point, String, BigNumber, et ainsi de suite. La plupart des types de référence ne devraient pas ne devraient pas surcharger la méthode égalité opérateur, même s'ils remplacent Equals . Cependant, si vous implémentez un type de référence qui est destiné à avoir une sémantique de valeur comme un type de nombre complexe complexe, vous devez remplacer l'opérateur d'égalité d'égalité.
3 votes
"La plupart des types de référence ne doivent pas surcharger l'opérateur d'égalité, même s'ils surchargent Equals" ? Wow, je trouve ça un peu... hum... bizarre. Ainsi, a.Equals(b) pourrait être vrai, et a==b pourrait être faux. Si je veux savoir si les références sont égales (ce qui est rarement le cas, honnêtement), j'utiliserais de toute façon .ReferenceEquals(a,b). J'aimerais que a==b renvoie la même chose que a.Equals(b). N'est-ce pas une "meilleure pratique" ?
0 votes
@FlipScript : Un problème majeur avec le remplacement de l'option
==
est qu'il s'agit en fait de deux opérateurs ; lorsqu'il est utilisé avec des types pour lesquels des surcharges existent, il utilise la surcharge ; sinon, si les opérandes sont des types de référence, il s'agit d'une vérification de l'égalité des références. Depuis==
est lié de manière statique plutôt que virtuelle, même lorsqu'il est utilisé avec des génériques, ce comportement peut entraîner des résultats inattendus. En vb.net, des opérateurs distincts sont utilisés pour l'égalité dérogatoire et l'égalité de référence, ce qui évite une telle ambiguïté.