Partager via


Ne pas surcharger l'opérateur égal (equals) sur les types référence

Mise à jour : novembre 2007

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Un type référence public ou public imbriqué surcharge l'opérateur d'égalité.

Description de la règle

Pour les types référence, l'implémentation par défaut de l'opérateur d'égalité est presque toujours correcte. Par défaut, deux références sont égales uniquement si elles pointent sur le même objet.

Comment corriger les violations

Pour corriger une violation de cette règle, supprimez l'implémentation de l'opérateur d'égalité.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle quand le type référence se comporte comme un type valeur intégré. Si appliquer des additions ou des soustractions à des instances du type est pertinent, il est probablement correct d'implémenter l'opérateur d'égalité et de supprimer la violation.

Exemple

L'exemple suivant montre le comportement par défaut lors de la comparaison de deux références.

using System;

namespace DesignLibrary
{
   public class MyReferenceType
   {
      private int a, b;
      public MyReferenceType (int a, int b)
      {
         this.a = a;
         this.b = b;
      }

      public override string ToString()
      {
         return String.Format("({0},{1})", a, b);
      }
   }
}

L'application suivante compare des références.

using System;

namespace DesignLibrary
{
    public class ReferenceTypeEquality
    {
       public static void Main()
       {
          MyReferenceType a = new MyReferenceType(2,2);
          MyReferenceType b = new MyReferenceType(2,2);
          MyReferenceType c = a;

          Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
          Console.WriteLine("c and a are equal? {0}", c.Equals(a)? "Yes":"No");
          Console.WriteLine("b and a are == ? {0}", b == a ? "Yes":"No");
          Console.WriteLine("c and a are == ? {0}", c == a ? "Yes":"No");     
       }
    }
}

Cet exemple génère la sortie suivante :

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

Règles connexes

Surchargez l'opérateur égal lors de la surcharge de l'opérateur d'addition et de soustraction

Voir aussi

Référence

Indications concernant l'implémentation de Equals et de l'opérateur d'égalité (==)

Object.Equals