C #: Comment l’object statique.Equals statique vérifie-t-il l’égalité?

Supposons que vous ayez deux classes différentes où chacune a sa propre implémentation d’Equal. lequel est utilisé? Et si un seul d’entre eux en avait un? Ou aucun d’entre eux? Les lignes suivantes sont-elles équivalentes?

object .Equals( first, second ) first .Equals( second ) second .Equals( first ) 

Je devine que les deux premiers pourraient être équivalents, mais je n’ai pas la moindre idée.

Que fait-il vraiment?

Fondamentalement, il fait trois choses:

  • Vérifier l’égalité de référence (renvoyer true si c’est le cas)
  • Vérifier la nullité de la référence (retourne false si l’une des valeurs est null; le cas null == null a déjà été traité)
  • Vérifiez l’égalité des valeurs avec first.Equals(second)

L’ordre ne devrait pas avoir d’ importance si les deux valeurs ont des implémentations d’égalité correctes, car l’égalité doit être implémentée de telle 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é. La documentation en ligne ne mentionne pas cela, assez intéressant.

Pour rendre 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. } 

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

Toutefois, cela peut être surchargé dans l’object afin que les développeurs puissent comparer deux objects qui ne se trouvent pas dans le même emplacement de mémoire tout en restant considérés comme égaux. Par exemple, si vous aviez une couche d’access aux données où chaque object avait l’identifiant de son enregistrement de données de la firebase database, vous pourriez avoir une égalité d’object comparée basée sur l’ID.

Vous pouvez surcharger les opérateurs pour produire cette fonctionnalité.