Udostępnij za pośrednictwem


CA1046: Nie przeciążaj operatora equals w typach referencyjnych

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

Kategoria

Microsoft.Design

Zmiana kluczowa

Kluczowa

Przyczyna

Publiczny lub zagnieżdżony publiczny typ referencyjny przeciąża operator równości.

Opis reguły

Dla typów odwołań domyślna implementacja operatora równości jest prawie zawsze poprawna.Domyślnie dwa odwołania są równe tylko wtedy, gdy wskazują ten sam obiekt.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy usunąć implementację operatora równości.

Kiedy pominąć ostrzeżenia

Bezpiecznie jest pomijać ostrzeżenia dotyczące tej reguły, gdy typ referencyjny zachowuje się jak wbudowany typ wartościowy.Jeśli jest ważne aby wykonywać operacje dodawania lub odejmowania na wystąpieniach tego typu, prawdopodobnie właściwym jest zaimplementować operator równości i pominąć naruszenie.

Przykład

Poniższy przykład ilustruje domyślne zachowanie podczas porównywania dwóch odwołań.

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

Następująca aplikacja porównuje niektóre odwołania.

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

Ten przykład generuje następujące wyniki.

  
  
  
  
  

Powiązane reguły

CA1013: Przeciąż operator equals przeciążając operatory add i subtract

Zobacz też

Informacje

Object.Equals

Inne zasoby

Guidelines for Implementing Equals and the Equality Operator (==)