Maison >développement back-end >C++ >Pourquoi devez-vous remplacer «GethashCode» lors de la remplacement de «Equals»?

Pourquoi devez-vous remplacer «GethashCode» lors de la remplacement de «Equals»?

Linda Hamilton
Linda Hamiltonoriginal
2025-02-02 15:16:10409parcourir

Why Must You Override `GetHashCode` When Overriding `Equals`?

Override GetHashCode et Equals pour la comparaison cohérente des objets

Lorsque vous redéfinissez la façon dont les objets d'une classe sont comparés pour l'égalité en remplaçant la méthode Equals, il est essentiel de remplacer également la méthode GetHashCode. Ceci est particulièrement important lorsque vos objets sont utilisés comme clés dans des collections basées sur le hachage comme les dictionnaires ou les ensembles de hachage.

Considérons une classe Foo:

<code class="language-csharp">public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}</code>

Si vous personnalisez Equals pour comparer les objets Foo basés sur une propriété FooId, la valeur par défaut GetHashCode (héritée de Object) générera toujours des codes de hachage en fonction de l'adresse mémoire de l'objet. Cette incohérence conduit à un comportement imprévisible lors de l'utilisation d'objets Foo comme clés dans les tables de hachage.

Pourquoi le hachage cohérent compte

Le remplacement GetHashCode est crucial pour:

  • Hachage cohérent: Le code de hachage d'un objet détermine son emplacement dans une table de hachage. Objets égaux doivent avoir le même code de hachage pour s'assurer qu'ils sont systématiquement placés dans le même seau.
  • Éviter les collisions de hachage: Si deux objets ont le même code de hachage (une collision), les collections basées sur le hachage peuvent incorrectement supposer qu'elles sont identiques sans appeler Equals pour vérifier. Un GetHashCode bien impliqué minimise les collisions, garantissant que Equals est utilisé pour déterminer la véritable égalité.

Implémentation de GetHashCode efficacement

L'implémentation GetHashCode doit s'aligner sur la logique de la méthode Equals:

  • Les objets égaux doivent avoir des codes de hachage identiques.
  • Les codes de hachage identiques ne garantissent pas l'égalité, mais ils déclenchent la méthode Equals pour une comparaison définitive.

Pour la classe Foo, une remplacement GetHashCode approprié est:

<code class="language-csharp">public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}</code>

Cela génère des codes de hachage basés sur FooId, reflétant la vérification de l'égalité Equals.

en utilisant des comparateurs personnalisés pour une clarté améliorée

Lorsque vous remplacez Equals et GetHashCode, envisagez d'ajouter des opérateurs d'égalité personnalisés (== et !=) pour améliorer la lisibilité et la maintenabilité du code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn