Dela via


CA1815: Åsidosätt equals och operator equals för värdetyper

Egenskap Värde
Regel-ID CA1815
Title Åsidosätt equals och operatorn == på värdetyper
Kategori Prestanda
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

En värdetyp åsidosätter System.Object.Equals inte eller implementerar inte likhetsoperatorn (==). Den här regeln kontrollerar inte uppräkningar.

Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.

Regelbeskrivning

För icke-blittable-värdetyper använder Equals den ärvda implementeringen av System.Reflection biblioteket för att jämföra innehållet i alla fält. Reflektioner är beräkningsmässigt dyra, och det kan vara onödigt att jämföra varje fält för att avgöra likhet. Om du förväntar dig att användarna ska jämföra eller sortera instanser, eller använda dem som hashtabellnycklar, bör värdetypen implementera Equals. Om ditt programmeringsspråk stöder operatoröverlagring bör du även implementera likhets- och skillnadsoperatorerna.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln anger du en implementering av Equals. Om du kan implementera likhetsoperatorn.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om instanser av värdetypen inte jämförs med varandra.

Ignorera 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 CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815

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.CA1815.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 den gäller för eller för alla regler i den här kategorin (Prestanda) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika ytor för API:er

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

Följande kod visar en struktur (värdetyp) som bryter mot den här regeln:

// Violates this rule
public struct Point
{
    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    public int X { get; }

    public int Y { get; }
}

Följande kod åtgärdar den tidigare överträdelsen genom att System.ValueType.Equals åsidosätta och implementera likhetsoperatorerna (== och !=):

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

Se även