Не перегружайте оператор равенства для ссылочных типов
Обновлен: Ноябрь 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
Связанные правила
Перегружайте оператор равенства при перегрузке сложения и вычитания