J'ai lu sur 10 questions sur quand et comment remplacer GetHashCode mais il y a encore quelque chose que je n'ai pas tout à fait le faire. La plupart des implémentations de GetHashCode sont fondées sur les codes de hachage des champs de l'objet, mais il a été cité que la valeur de GetHashCode ne faut pas changer au cours de la durée de vie de l'objet. Comment cela fonctionne si les champs que c'est basé sur sont mutables? Aussi que faire si je ne veux dictionnaire des recherches etc pour être fondé sur la référence à l'égalité a pas remplacé mon Égal?
Je suis principalement primordial est Égal pour la facilité de l'unité de tester mon code de sérialisation qui, je suppose la sérialisation et la désérialisation (XML dans mon cas) tue la référence à l'égalité, donc je veux m'assurer au moins qu'il est approprié par la valeur de l'égalité. Est-ce une mauvaise pratique de remplacer Équivaut dans ce cas? Fondamentalement, en plus de l'exécution de code que j'ai envie de référence de l'égalité et j'ai toujours utiliser == et je ne suis pas primordial que. Devrais-je créer une nouvelle méthode ValueEquals ou quelque chose à la place primordiale à l'Égal? J'ai utilisé de supposer que le cadre utilise toujours == et non Équivaut à comparer des choses et donc je pensais qu'il était sûr à remplacer est égal, car il me semblait comme le but est pour, si vous voulez avoir un 2ème définition de l'égalité qui est différent de l'opérateur==. À la lecture de plusieurs autres questions mais il semble que ce n'est pas le cas.
EDIT:
Il semble que mes intentions n'étaient pas claires, ce que je veux dire, c'est que 99% du temps, je veux ancienne brut de référence de l'égalité, le comportement par défaut, pas de surprises. Pour des cas très rares, je veux avoir la valeur d'égalité, et je tiens à la demande explicite de la valeur de l'égalité à l'aide de ".Équivaut à" au lieu de "==".
Quand je fais cela, le compilateur recommande je remplacer GetHashCode ainsi, et c'est la façon dont cette question est venu. Il me semblait qu'il y est de contredire les objectifs pour GetHashCode lorsqu'il est appliqué à mutable objets, qui sont les suivants:
- Si un.Equals(b) puis une.GetHashCode() doit == b.GetHashCode()
- La valeur de un.GetHashCode() ne devraient jamais changer pour la durée de vie d'un
Ceux-ci semblent naturellement contredire lorsqu'un objet mutable, parce que si l'état de l'objet de modifications, nous nous attendons à ce que la valeur de .Equals() pour modifier, ce qui signifie que GetHashCode devrait changer pour correspondre le changement .Equals(), mais GetHashCode ne devrait pas changer.
Pourquoi ne semble y avoir cette contradiction? Ces recommandations sont-elles pas vocation à s'appliquer à des objets mutables? Probablement supposé, mais peut-être la peine de mentionner, je fais allusion à des classes non des structures.
Résolution:
Je suis marquage JaredPar acceptée, mais surtout pour les commentaires de l'interaction. Pour résumer ce que j'ai appris c'est que la seule façon d'atteindre tous les objectifs et d'éviter d'éventuelles bizarre comportement en cas de bord est à remplacer que d'égal à Égal et GetHashCode basé sur immuable champs, ou de mettre en œuvre IEquatable. Ce genre de semble diminuer l'utilité de remplacement est Égal pour les types référence, à partir de ce que j'ai vu la plupart des types de référence n'ont généralement pas immuable champs, sauf si elles sont stockées dans une base de données relationnelle de les identifier avec leurs clés primaires.