La création de la méthode GetHashCode en C#
Quelle est la meilleure façon de créer votre propre méthode GetHashCode pour une classe en C#? Supposons que j'ai une classe simple (qui remplace la méthode Equals), comme suit:
class Test
{
public string[] names;
public double[] values;
public override bool Equals(object obj)
{
return (obj is Test) && this.Equals((Test)obj);
}
public bool Equals(Test t)
{
return names.Equals(t.names) && values.Equals(t.values);
}
}
Dois-je utiliser le code par défaut pour la méthode GetHashCode?
public override int GetHashCode()
{
return base.GetHashCode();
}
Dois-je de la base de la méthode sur le contenu de ma classe?
public override int GetHashCode()
{
return names.GetHashCode() + values.GetHashCode() ;
}
Ou dois-je faire autre chose?
Vous n'êtes pas primordial est égal correctement ici.
En fait, je pense qu'il va conduire à stackoverflow.
Non, ça n'a pas de débordement de la pile. Cependant, elle ne fonctionne pas, soit.
Il a déjà conduit à stackoverflow.
Boom Boom tish.
En fait, je pense qu'il va conduire à stackoverflow.
Non, ça n'a pas de débordement de la pile. Cependant, elle ne fonctionne pas, soit.
Il a déjà conduit à stackoverflow.
Boom Boom tish.
OriginalL'auteur Richie Cotton | 2009-07-22
Vous devez vous connecter pour publier un commentaire.
System.Array
ne remplace pasGetHashCode
ouEquals
, donc ils ont utilisé la référence à l'égalité. Par conséquent, vous ne devriez pas appeler.À mettre en œuvre
GetHashCode
, voir cette question.À mettre en œuvre
Equals
, utilisez leSequenceEqual
méthode d'extension.MODIFIER: Sur .Net 2.0, vous devrez écrire votre propre version de
SequenceEqual
, comme ceci:Vous pouvez l'écrire à prendre
IEnumerable<T>
au lieu deIList<T>
, mais ce serait un peu plus lent car il ne serait pas en mesure de quitter tôt si les paramètres ont des tailles différentes.OriginalL'auteur SLaks
Il est vraiment important de assurez-vous de garder le remplacer .GetHashCode() à l'étape avec .Equals().
Fondamentalement, vous devez vous assurer qu'ils considèrent les mêmes champs afin de ne pas violer le premier des trois règles de GetHashCode (à partir de MSDN objet.GetHashCode())
En d'autres termes, vous devez vous assurer que tous les temps .Est égal considère deux cas d'égalité, ils auront également le même .GetHashCode().
Comme mentionné par quelqu'un d'autre ici, cette question de détails, une bonne mise en œuvre.
Dans le cas où vous êtes intéressé, j'ai écrit quelques articles de blog sur l'étude des codes de hachage début de l'année dernière. Vous pouvez trouver mes divagations ici (la première entrée de blog que j'ai écrit sur le sujet)
OriginalL'auteur Rob Levine
Il y a une bonne discussion des questions ici, et la plus récente mise à jour se réfère à la BaseObject classe abstraite fournis par SharpArchitecture.
Si vous voulez quelque chose de plus ad hoc, j'ai trouvé que le code que ReSharper génère pour Equals() et GetHashCode() c'est bien.
OriginalL'auteur Dave W