No sobrecargar el operador Equals en tipos de referencia

Actualización: noviembre 2007

Nombre de tipo

DoNotOverloadOperatorEqualsOnReferenceTypes

Identificador de comprobación

CA1046

Categoría

Microsoft.Design

Cambio problemático

Motivo

Un tipo de referencia público o anidado público sobrecarga el operador de igualdad.

Descripción de la regla

Para los tipos de referencia, la implementación predeterminada del operador de igualdad casi siempre es correcta. De manera predeterminada, dos referencias son iguales sólo si señalan al mismo objeto.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite la implementación del operador de igualdad.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla cuando el tipo de referencia se comporte como tipo de valor integrado. Si tiene sentido realizar sumas o restas en instancias del tipo, es probable que sea correcto implementar el operador de igualdad y suprimir la infracción.

Ejemplo

El ejemplo siguiente muestra el comportamiento predeterminado al comparar dos referencias.

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

La aplicación siguiente compara algunas referencias.

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

Este ejemplo produce el siguiente resultado.

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

Reglas relacionadas

Sobrecargar el operador de igualdad al sobrecargar los operadores de suma y resta

Vea también

Referencia

Instrucciones para implementar Equals y el operador de igualdad (==)

Object.Equals