5 votes

Fonctionnement interne de "equals" dans .NET

En général, "System.Object" implémente "Equals". Lorsque j'implémente l'interface IEquatable, je peux donner une définition personnalisée (je le crois) à mes "Equals".

Ainsi, l'implémentation de la classe professeur est égale à

class Professor:System.Object,IEquatable

Puisqu'il existe des définitions différentes de System.Equals et de IEquatable's Equals, pourquoi C# n'a-t-il pas signalé d'erreur ? parce que je ne surcharge pas "Equals" et que je ne cache même pas "Equals" en utilisant le nouveau mot-clé.

class Professor : IEquatable<Professor>
{

   public string Name { get; set; }

   public bool Equals(Professor cust)
   {
       if (cust == null) return false;
       return cust.Name == this.Name;
   }

}

8voto

LBushkin Points 60611

Vous ne remplacez ni ne cachez Object.Equals() parce que votre version prend Professeur comme type de paramètre - pas objet. Votre version surcharge la méthode Equals().

C# permet à deux méthodes portant le même nom de différer par le type d'argument(s) qu'elles acceptent. C'est ce qu'on appelle la surcharge - on peut la considérer comme du polymorphisme à la compilation.

Remplacement de (ce que vous pourriez, et devriez probablement faire aussi) modifie l'implémentation d'une méthode à partir de sa version dans une classe de base. C'est la base du polymorphisme de type d'exécution.

Cacher est une technique moins courante qui permet à une classe dérivée de masque une version d'une méthode dans une classe de base. En fonction du type de la référence par laquelle vous effectuez l'appel, vous pouvez soit obtenir la version de la classe de base (si elle est appelée par une référence de classe de base) ou la version de la classe dérivée (si elle est appelée par une référence de type dérivé).

Pour votre deuxième question, vous devez utiliser IEquatable<T> alors qu'il existe une sémantique pour comparer l'"égalité" de deux instances qui est distincte de l'égalité des références.

Vous devez mettre en œuvre IComparable ou IComparable<T> lorsqu'il existe une sémantique pour ordonner les éléments. Cela signifie qu'ils peuvent être inférieurs à, supérieurs à, ou équivalents.

1voto

BrightUmbra Points 13844

La méthode Object.Equals accepte un objet de type 'object' comme paramètre. Votre méthode Equals accepte un objet de type 'Professor' comme paramètre. Ces deux méthodes peuvent coexister car il est légal de différencier deux méthodes de même nom par leur liste de paramètres ; c'est ce qu'on appelle la surcharge de méthodes.

1voto

Anna Lear Points 13919

Vous n'avez pas besoin d'implémenter explicitement IEquatable si tout ce que vous voulez faire est de remplacer l'implémentation par défaut de Equals().

Vous pouvez juste faire quelque chose comme ça :

class Professor
{

   public string Name { get; set; }

   public override bool Equals(object cust)
   {
       if (cust == null || !(cust is Professor)) return false;
       return cust.Name == this.Name;
   }

}

Sachez que si vous surchargez Equals(), vous devez également surcharger GetHashCode() pour garantir le bon fonctionnement des dictionnaires et autres collections qui utilisent le hachage pour différencier les objets. Voici la page MSDN directives pour le remplacement de Equals() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X