Share via


CA1815: Onderdrukking is gelijk aan en operator is gelijk aan waardetypen

Eigenschappen Weergegeven als
Regel-id CA1815
Titel Onderdrukking is gelijk aan en operator is gelijk aan waardetypen
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

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-belichte waardetypen wordt de overgenomen implementatie van Equals de System.Reflection bibliotheek gebruikt om de inhoud van alle velden te vergelijken. Weerspiegeling is rekenkrachtig en het vergelijken van elk veld voor gelijkheid kan onnodig zijn. Als u verwacht dat gebruikers instanties vergelijken of sorteren, of deze gebruiken als hashtabelsleutels, moet uw waardetype worden geïmplementeerd Equals. Als uw programmeertaal overbelasting van operatoren ondersteunt, moet u ook een implementatie bieden van de operatoren voor gelijkheid en ongelijkheid.

Schendingen oplossen

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 Codeanalysewaarschuwingen onderdrukken voor meer informatie.

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 instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. 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

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 de gelijkheidsoperators (en!=) te overschrijven System.ValueType.Equals 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