Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egendom | Värde |
|---|---|
| Regel-ID | CA1046 |
| Title | Överbelasta inte operatorn `equals` för referenstyper |
| Kategori | Design |
| Korrigeringen är icke-bakåtkompatibel | Bryta |
| Aktiverad som standard i .NET 9 | Nej |
Orsak
En offentlig eller kapslad offentlig referenstyp överbelastar likhetsoperatorn.
Regelbeskrivning
För referenstyper är standardimplementeringen av likhetsoperatorn nästan alltid korrekt. Som standard är två referenser bara lika med om de pekar på samma objekt.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln tar du bort implementeringen av likhetsoperatorn.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln när referenstypen fungerar som en inbyggd värdetyp. Om det är meningsfullt att göra addition eller subtraktion på instanser av typen, är det förmodligen korrekt att implementera likhetsoperatorn och ignorera överträdelsen.
Undertrycka en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1046
// The code that's violating the rule is on this line.
#pragma warning restore CA1046
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1046.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Inkludera specifika API-ytor
Du kan konfigurera vilka delar av kodbasen som ska köra den här regeln baserat på deras tillgänglighet genom att ange alternativet api_surface. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Anteckning
Ersätt den XXXX delen av CAXXXX med ID:t för den tillämpliga regeln.
Exempel 1
I följande exempel visas standardbeteendet när du jämför två referenser.
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($"({a},{b})");
}
}
Exempel 2
I följande program jämförs vissa referenser.
public class ReferenceTypeEquality
{
public static void Main1046()
{
MyReferenceType a = new(2, 2);
MyReferenceType b = new(2, 2);
MyReferenceType c = a;
Console.WriteLine($"a = new {a} and b = new {b} are equal? {(a.Equals(b) ? "Yes" : "No")}");
Console.WriteLine($"c and a are equal? {(c.Equals(a) ? "Yes" : "No")}");
Console.WriteLine($"b and a are == ? {(b == a ? "Yes" : "No")}");
Console.WriteLine($"c and a are == ? {(c == a ? "Yes" : "No")}");
}
}
Det här exemplet genererar följande utdata:
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