CA1046 : Ne pas surcharger l'opérateur égal à sur les types référenceCA1046: Do not overload operator equals on reference types

TypeNameTypeName DoNotOverloadOperatorEqualsOnReferenceTypesDoNotOverloadOperatorEqualsOnReferenceTypes
CheckIdCheckId CA1046CA1046
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Un type public ou imbriqué référence publique surcharge l’opérateur d’égalité.A public or nested public reference type overloads the equality operator.

Description de la règleRule Description

Pour les types référence, l’implémentation par défaut de l’opérateur d’égalité est presque toujours correcte.For reference types, the default implementation of the equality operator is almost always correct. Par défaut, deux références sont égales uniquement si elles pointent sur le même objet.By default, two references are equal only if they point to the same object.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, supprimez l’implémentation de l’opérateur d’égalité.To fix a violation of this rule, remove the implementation of the equality operator.

Quand supprimer les avertissementsWhen to Suppress Warnings

Il est possible de supprimer un avertissement de cette règle quand le type de référence se comporte comme un type valeur intégré.It is safe to suppress a warning from this rule when the reference type behaves like a built-in value type. S’il est significatif pour effectuer une addition ou soustraction sur des instances du type, il est probablement correct implémenter l’opérateur d’égalité et de supprimer la violation.If it is meaningful to do addition or subtraction on instances of the type, it is probably correct to implement the equality operator and suppress the violation.

ExempleExample

L’exemple suivant montre le comportement par défaut lors de la comparaison de deux références.The following example demonstrates the default behavior when comparing two references.

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);
      }
   }
}

ExempleExample

L’application suivante compare des références.The following application compares some references.

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 produit la sortie suivante.This example produces the following output.

un = nouveau (2,2) et b = nouveau (2,2) sont égaux ? Ne c et a sont égaux ? Oui b et a sont == ? Ne c et a sont == ? Ouia = 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

CA1013 : Surchargez l’opérateur égal lors de la surcharge de l’opérateur d’addition et de soustractionCA1013: Overload operator equals on overloading add and subtract

Voir aussiSee Also

System.Object.Equals Opérateurs d’égalitéSystem.Object.Equals Equality Operators