Qu'est-ce que GetHashCode devrait renvoyer lorsque l'identifiant de l'objet est nul?
Lequel des énoncés suivants est correct/mieux en considérant que l'identité de la propriété pourrait être null.
public override int GetHashCode()
{
if (ID == null) {
return base.GetHashCode();
}
return ID.GetHashCode();
}
OU
public override int GetHashCode()
{
if (ID != null) {
return ID.GetHashCode();
}
return 0;
}
Mise à jour 1: mise à Jour de la 2e option.
Mise à jour 2: ci-Dessous sont les Égaux des implémentations:
public bool Equals(IContract other)
{
if (other == null)
return false;
if (this.ID.Equals(other.ID)) {
return true;
}
return false;
}
public override bool Equals(object obj)
{
if (obj == null)
return base.Equals(obj);
if (!obj is IContract) {
throw new InvalidCastException("The 'obj' argument is not an IContract object.");
} else {
return Equals((IContract)obj);
}
}
Et l'ID est de string
type.
source d'informationauteur Dienekes
Vous devez vous connecter pour publier un commentaire.
Cela dépend vraiment de ce que vous voulez l'égalité de moyenne - la chose importante est que deux objets égaux retour le même hashcode. Ce qui ne l'égalité de dire quand l'ID est null? Actuellement votre méthode Equals serait ont retourner la valeur true si l'ID propriétés ont la même valeur... mais nous ne savons pas ce qu'il fait si l'ID est null.
Si vous avez réellement voulez le comportement de la première version, je serais personnellement utiliser:
EDIT: en Fonction de votre méthode Equals, il semble que vous pouvez faire de votre méthode GetHashCode:
Noter que votre
Equals(IContract other)
méthode pourrait ressembler à ceci:Votre implémentation actuelle va réellement lancer une exception si
this.ID
est nul...En outre, votre
Equals(object)
méthode est incorrecte, vous ne devriez pas lancer une exception si vous êtes passé inappropriée d'un type d'objet, vous devez juste retourfalse
... idem siobj
est null. Donc vous pouvez simplement utiliser:Je m'inquiète au sujet de l'égalité basée sur une interface, cependant. Normalement, les deux classes de types différents ne devraient pas être considérés comme égaux même si l'implémenter la même interface.
Vous pouvez simplement
return 0;
, vous devez renvoyer le même HashCode pour les mêmes valeurs et 0 ne sera pas souvent renvoyé par ID.GetHashCode() ce type de fonction de Hachage peut être assez ok pour tous les besoins. Depuis votre combinaison de toutes les valeurs (comme le Nom et l'IDENTIFIANT de Hachages ) son assez clair ID est la définition de la source de HashCode de manière fixe 0 Null ID semble raisonnable.Autrement, cela pourrait être vrai que toute votre approche sur GetHashCode remplacer seulement en tenant compte du champ ID est mal ( et vous avez besoin de combiner plusieurs champs pour calculer le hachage)
Après vos modifications, je peux dire que la seconde est Égal à remplacer a trop de code , il suffit de le remplacer avec
Votre Equals(IContract contrat) remplacer apparaît buggy pour m'entraîner seule chose que la définition du contrat est ID et si IContract a plus de champs que l'ID sa va être une mauvaise Équivaut à remplacer.
PS: en Fait si IContract est une interface, vous aurez probablement besoin de remplacer votre
IEquatable<IContract>
pour un bétonIEquatable<ClassName>
contrat parce que sa va être une mauvaise conception pour être en mesure de revenir que dans une classe Différente intstances la mise en œuvre de la même interface d'égalité des sexes, par définition, nécessite de vérifier que les objets ont le même Type de la première étape de contrôle d'égalité (habituellement comme dans 99,9% des cas)Peut-être ce que vous voulez, c'est quelque chose comme cela?
L'important, c'est cela, si deux objets avec null Id être considéré comme l'égal?