Поделиться через


CA1046: не перегружайте оператор равенства для ссылочных типов

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

Категория

Microsoft.Design

Критическое изменение

Критическое изменение

Причина

Открытый или вложенный открытый ссылочный тип перегружает оператор равенства.

Описание правила

Реализация оператора равенства по умолчанию почти всегда правильно работает для ссылочных типов. По умолчанию две ссылки равны, если они указывают на один объект.

Устранение нарушений

Чтобы устранить нарушение данного правила, удалите реализацию оператора равенства.

Отключение предупреждений

Отключение предупреждений о нарушении этого правила безопасно в том случае, если ссылочный тип ведет себя как встроенный тип значения. Бессмысленно выполнять операции сложения или вычитания для экземпляров этого типа; возможно, будет правильным реализовать оператор равенства и отключить предупреждения о нарушении.

Пример

В следующем примере демонстрируется поведение по умолчанию при сравнении двух ссылок.

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

В следующем приложении сравниваются несколько ссылок.

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

После выполнения примера получается следующий результат.

            

Связанные правила

CA1013: перегружайте оператор равенства при перегрузке сложения и вычитания

См. также

Ссылки

Правила реализации метода Equals и оператора равенства (==)

Object.Equals