Share via


CA2245: Tilldela inte en egenskap till sig själv

Property Värde
Regel-ID CA2245
Title Tilldela inte en egenskap till sig själv
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En egenskap tilldelades av misstag till sig själv.

Regelbeskrivning

C#-kompilatorn genererar en varnings-CS1717 : Tilldelning till samma variabel. Menade du att tilldela något annat? när ett fält, en lokal symbol eller en parametersymbol tilldelas till sig själv. Ett sådant misstag är vanligt när en lokal symbol, parameter eller fältsymbol har ett namn som liknar en annan symbol i omfånget. I stället för att använda olika symboler på vänster och höger sida av tilldelningen användes samma symbol på båda sidor. Detta leder till en redundant tilldelning av värdet till sig själv och indikerar vanligtvis en funktionell bugg.

Att tilldela en egenskap till sig själv är också en liknande funktionell bugg för nästan alla verkliga fall. Men i vissa extrema hörnfall kan hämtning av ett egenskapsvärde ha biverkningar och egenskapens nya värde skiljer sig från det ursprungliga värdet. I så fall är egenskapens självtilldelning inte redundant och kan inte tas bort. Detta förhindrar att kompilatorn genererar en CS1717 varning för självtilldelning av egenskapen, utan att någon icke-bakåtkompatibel ändring införs för dessa fall.

Syftet med regeln CA2245 är att fylla denna lucka. Den rapporterar överträdelsen för självtilldelning av egenskapen för att hjälpa till att åtgärda dessa funktionella buggar. För den lilla uppsättningen hörnfall där självtilldelning av egenskapen är önskvärd CA2245 kan överträdelser ignoreras i källan med en lämplig motiveringskommentar.

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

Om du vill åtgärda överträdelser använder du olika symboler till vänster och till höger om tilldelningen. Följande kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar den:

public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // CS1717: Accidentally assigned the parameter 'p' to itself.
        p = p;

        // CA2245: Accidentally assigned the property 'P' to itself.
        P = P;
    }
}
public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // No violation, now the parameter is assigned to the field.
        this.p = p;

        // No violation, now the parameter is assigned to the property.
        P = p;
    }
}

När du ska ignorera varningar

Det är säkert att förhindra överträdelser från den här regeln om hämtning av ett egenskapsvärde kan ha biverkningar och egenskapens nya värde skiljer sig från det ursprungliga värdet. I så fall är egenskapens självtilldelning inte redundant. En motiveringskommentare bör läggas till i undertryckningen för att dokumentera detta som förväntat beteende.

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

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.CA2245.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även