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
Libérer: 2025-02-02 15:16:10
original
407 Les gens l'ont consulté

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:

public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}
Copier après la connexion

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:

public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal