Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1815 |
| Titel | Overschrijf de equals() methode en operator == voor waardetypen |
| Categorie | Prestaties |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Nee |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Een waardetype overschrijft System.Object.Equals niet of implementeert de gelijkheidsoperator (==). Met deze regel worden opsommingen niet gecontroleerd.
Deze regel kijkt standaard alleen naar extern zichtbare typen, maar dit kan worden geconfigureerd.
Beschrijving van regel
Voor niet-blittable waardetypen maakt de overgenomen implementatie van Equals gebruik van de System.Reflection bibliotheek om de inhoud van alle velden te vergelijken. Reflectie is rekenintensief, en het vergelijken van elk veld om te zien of ze gelijk zijn, kan onnodig zijn. Als u verwacht dat gebruikers instanties vergelijken of sorteren, of deze gebruiken als hashtabelsleutels, moet uw waardetype Equals implementeren. Als uw programmeertaal operator-overloading ondersteunt, moet u ook een implementatie bieden van de gelijkheids- en ongelijkheidsoperatoren.
Hoe schendingen op te lossen
Als u een schending van deze regel wilt oplossen, geeft u een implementatie van Equals. Als u dat kunt, implementeert u de gelijkheidsoperator.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als exemplaren van het waardetype niet met elkaar worden vergeleken.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (prestaties) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Specifieke API-oppervlakken opnemen
U kunt configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid, door de optie api_surface in te stellen. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Notitie
Vervang het XXXX deel van CAXXXX door de id van de toepasselijke regel.
Voorbeeld
De volgende code toont een structuur (waardetype) die deze regel schendt:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
Met de volgende code wordt de vorige schending opgelost door System.ValueType.Equals te overschrijven en de gelijkheidsoperators (== en !=) te implementeren.
public struct Point : IEquatable<Point>
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
public override int GetHashCode()
{
return X ^ Y;
}
public override bool Equals(object? obj)
{
if (!(obj is Point))
return false;
return Equals((Point)obj);
}
public bool Equals(Point other)
{
if (X != other.X)
return false;
return Y == other.Y;
}
public static bool operator ==(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return !point1.Equals(point2);
}
}
Gerelateerde regels
- CA2231: Overload de operator "equals" bij het overschrijven van ValueType.Equals
- CA2226: Operators moeten symmetrische overbelastingen hebben