CA1046: Nie obciążając operator równości na typy odwołań
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ążenie operator równości na przeciążenie Dodawanie i odejmowanie
Zobacz też
Informacje
Guidelines for Implementing Equals and the Equality Operator (==)