2009-10-07 3 views
0

Les documents pour Object.Equals indiquent que les implémenteurs doivent renvoyer false si le paramètre est une référence NULL.Est-il toujours acceptable de renvoyer True lorsque le paramètre Equals est une référence nulle?

Dans ma classe, je surcharge Equals pour vérifier l'égalité des valeurs. J'ai une variable membre qui est similaire à la structure Nullable (T). Mon inclination initiale est de renvoyer Vrai quand on me donne une référence nulle et que la propriété HasValue de ma structure est Faux.

Est-il toujours acceptable de renvoyer True lorsque le paramètre Equals est une référence nulle?

EDIT Pour illustration:

class ExampleClass { 

    SomeValueType? x; 

    bool Equals(object other) { 
     if (other == null) return false; // <-- returns a different value than x.Equals 
     return x.Equals(other); 
    } 
} 
+2

Est-ce que null == null? C'est une bonne boîte de vers philosophique. – spender

+0

@spender: 'Object.Equals' ne peut jamais être invoqué quand' this' est 'null', et le littéral dans le code' null == null' est vrai, donc le point est discutable. –

+1

Ah. C'est seulement vrai pour la commodité. Je me bats encore dans ma tête. – spender

Répondre

6

Nullable<T>.Equals(object) est la suivante:

public override bool Equals(object other) 
{ 
    if (!this.HasValue) 
    { 
     return (other == null); 
    } 
    if (other == null) 
    { 
     return false; 
    } 
    return this.value.Equals(other); 
} 

Donc, la réponse à votre question est oui dans le cas d'un (type de valeur) struct avec nullable sémantique. Si votre type est un class (type de référence), la réponse est certainement non.

+0

Eh bien, ma classe se réfère à '' Equals' 'de ma structure. Il semble juste non intuitif de ne pas différer dans le cas particulier des références nulles. –

+0

De l'information limitée que j'ai maintenant (y compris votre exemple), votre conception semble non intuitive. Je tiens cela pour un type de référence, 'Equals' devrait * toujours * retourner' false' quand 'obj == null'. Qu'est-ce que vous essayez exactement de faire ici? Pourquoi ne pas faire de 'x' un' SomeValueType' au lieu de 'SomeValueType?'? –

+0

C'est un wrapper autour de Nullable (T) qui permet aux héritiers d'implémenter une méthode TryParseValueFromString. –

1

En fait, ce n'est pas le cas. La méthode equals ne peut pas renvoyer true lorsque deux objets sont NULL.

Pourquoi?

Eh bien, lorsque vous définissez

AnObject obj; 

obj est une référence à un objet (je parle pour Java, mais cela doit être un concept OO)

méthode

de Object.Equals prend un paramètre qui doit être un objet cependant null n'est pas un objet.

donc null.Equals (null) n'est pas une approche acceptable pour OO.

Edit:

Voilà pourquoi l'opérateur == diffère de méthode obj.Equals. null == null renvoie true sans aucun mal de tête. Edit2: Il semble que .Net a une incohérence à propos de la méthode Equals qui peut être sujet à un autre sujet.

int? a = null; 
a.Equals(null); // returns true without any problem. 

mais:

méthode Nullable<T>.Equals est définie comme suit:

Nullable<T>.Equals(object obj):bool 

Indique si le valeur Nullable actuelle est égale à une spécifiée objet

Puisque null n'est pas un objet, la documentation ou l'implémentation n'est pas correcte.

+2

Plus précisément, il s'agit de la différence entre la méthode statique 'Object.Equals (Object, Object)' et la méthode de membre virtuel 'Object.Equals (Object)'. Votre réponse ne tient pas compte du fait que, selon la norme (ECMA-335) le type de valeur spéciale boîtes '' Nullable à '' null' chaque fois HasValue' est faux. –

+0

@jcasso: La norme ECMA-335, donne spécifiquement sémantique particulière au type de valeur '' System.Nullable , qui boîtes à la référence d'objet à chaque fois que '' null' HasValue' est 'false'. La seule autre option serait de faire 'Nullable ' un type de référence qui pourrait effectivement être réglé sur une 'référence null', mais cela aurait un impact significatif (négatif) sur la performance, car il serait effectivement la même chose que la boxe/unboxing le type sous-jacent. –

+0

@ 280Z28 Il semble que la méthode .equals (objet) Nullable fasse un travail différent ici. Il remplace la méthode System.Object.Equals. Ne jetez pas exception si la propriété HasValue est faux ... Comme je l'ai mentionné ci-dessus, je parlais pour Java, mais ce dont nous parlons ici est pas seulement une langue, il est de la programmation orientée objet. Et pour moi, j'insiste toujours sur le fait que c'est une très mauvaise approche. Equals mehtod doit se comparer aux objets, pas aux références d'objets. – JCasso

Questions connexes