CA1815: Overschrijf equals en operator equals op waardetypen

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);
    }
}

Zie ook