human
J'ai lu dans le livre Essential C# 3.0 et .NET 3.5 que :

  Le retour de GetHashCode() pour un objet particulier devrait être constant (la même valeur), même si les données de l'objet changent. Dans de nombreux cas, vous devriez mettre en cache le retour de la méthode pour appliquer cette règle.

Est-ce une directive valide ?
J'ai essayé quelques types intégrés dans .NET et ils ne se comportaient pas ainsi
gpt
La réponse est principalement, c'est une directive valide, mais peut-être pas une règle valide. Cela ne raconte pas toute l'histoire non plus.

Le point qui est fait est que pour les types mutables, vous ne pouvez pas baser le code de hachage sur les données mutables car deux objets égaux doivent renvoyer le même code de hachage et le code de hachage doit être valide pendant toute la durée de vie de l'objet. Si le code de hachage change, vous vous retrouvez avec un objet qui se perd dans une collection hachée car il ne se trouve plus dans le bon compartiment de hachage.
Par exemple, l'objet A renvoie un hachage de 1. Donc, il va dans le compartiment 1 de la table de hachage. Ensuite, vous modifiez l'objet A de sorte qu'il renvoie un hachage de 2. Lorsqu'une table de hachage le recherche, elle regarde dans le compartiment 2 et ne le trouve pas - l'objet est abandonné dans le compartiment 1. C'est pourquoi le code de hachage ne doit pas changer pendant toute la durée de vie de l'objet, et c'est juste une des raisons pour lesquelles écrire des implémentations de GetHashCode est une corvée.

Une directive est juste un guide, pas une règle. En réalité, ```GetHashCode``` doit suivre ces directives lorsque les choses s'attendent à ce que l'objet suive les directives, comme lorsqu'il est stocké dans une table de hachage. Si vous n'avez jamais l'intention d'utiliser vos objets dans des tables de hachage (ou toute autre chose qui repose sur les règles de ```GetHashCode```), votre implémentation n'a pas besoin de suivre les directives. Lorsque vous voyez "pendant toute la durée de vie de l'objet", vous devriez lire "pendant le temps où l'objet doit coopérer avec les tables de hachage" ou similaire. Comme la plupart des choses, ```GetHashCode``` consiste à savoir quand enfreindre les règles.