2009-09-20 13 views
21

Disons que vous avez deux classes différentes où chacune a sa propre implémentation de Equals; lequel est utilisé? Et si seulement un d'entre eux en avait un? Ou aucun d'entre eux? Est-ce que l'une des lignes suivantes est équivalente? Je suppose que les deux premiers peuvent être équivalents, mais je n'ai pas vraiment d'idée.C#: Comment l'objet static.Equals vérifie-t-il l'égalité?

Que fait-il vraiment?

Répondre

40

Fondamentalement, il fait trois choses:

  • Vérifier l'égalité de référence (return true si oui)
  • Vérifier la nullité de référence (return false si l'une valeur est nulle, maintenant le null == cas null a été traitée)
  • Vérifier l'égalité de valeur avec first.Equals(second)

La commande ne devrait pas importe si les deux les valeurs ont des implémentations d'égalité bien conduites, car l'égalité doit être implémentée de sorte que x.Equals(y) implique y.Equals(x). Cependant, la documentation hors ligne que j'ai installée indique que first.Equals (second) (ou objA.equals (objB) pour utiliser le nom de paramètre réel) est spécifié. Le online documentation ne mentionne pas cela, assez intéressant.

Juste pour faire tout cela concret, la mise en œuvre pourrait ressembler à ceci:

public static bool Equals(object x, object y) 
{ 
    if (x == y) // Reference equality only; overloaded operators are ignored 
    { 
     return true; 
    } 
    if (x == null || y == null) // Again, reference checks 
    { 
     return false; 
    } 
    return x.Equals(y); // Safe as we know x != null. 
} 
+1

Il faut souligner que la principale différence entre le 'Object.Equals 'statique et le' first.Equals' (second) 'est que ce dernier ** échouera ** si' first' est une référence nulle. –

1

Par défaut, l'équivalence de l'objet est déterminée par l'adresse dans la mémoire de l'objet. Si les deux instances ont la même adresse mémoire, elles sont égales.

Toutefois, ceci peut être surchargé dans l'objet afin que les développeurs puissent comparer deux objets qui ne sont pas dans le même emplacement mémoire et qui sont toujours considérés égaux. Par exemple, si vous disposez d'un Data Access Layer dans lequel chaque objet possède l'ID de son enregistrement de données dans la base de données, vous pouvez comparer l'égalité des objets en fonction de l'ID. Vous pouvez overload operators pour produire cette fonctionnalité.

+0

Vous ne pouvez pas remplacer les opérateurs en C#. Vous pouvez * surcharger * les opérateurs, ou * remplacer * la méthode Equals. –

+0

Merci, l'a réparé. – Soviut