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
Inne zasoby
Guidelines for Implementing Equals and the Equality Operator (==)