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


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

Обновлен: Ноябрь 2007

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

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

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

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

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

См. также

Ссылки

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

Object.Equals