Condividi tramite


CA1046: Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo di riferimento pubblico annidato o pubblico esegue l'overload dell'operatore di uguaglianza.

Descrizione della regola

Per i tipi di riferimento, l'implementazione predefinita dell'operatore di uguaglianza è quasi sempre corretta. Per impostazione predefinita, i due riferimenti sono uguali solo se puntano allo stesso oggetto.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere l'implementazione dell'operatore di uguaglianza.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura quando il tipo di riferimento presenta il comportamento di un tipo di valore incorporato. Se ha significato eseguire addizioni o sottrazioni sulle istanze del tipo, è probabilmente corretto implementare l'operatore di uguaglianza ed escludere la violazione.

Esempio

Nell'esempio riportato di seguito viene illustrato il comportamento predefinito quando si confrontano due riferimenti.

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

Nell'applicazione riportata di seguito vengono confrontati alcuni riferimenti.

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

Questo esempio produce l'output che segue.

            

Regole correlate

CA1013: Eseguire l'overload dell'operatore "uguale a" all'overload degli operatori di addizione e sottrazione

Vedere anche

Riferimenti

Linee guida per l'implementazione del metodo Equals e dell'operatore di uguaglianza (==)

Object.Equals