Share via


CA2011: Tilldela inte egenskapen i dess setter

Property Värde
Regel-ID CA2011
Title Tilldela inte egenskapen i dess setter
Kategori Tillförlitlighet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En egenskap tilldelades av misstag ett värde i sin egen uppsättningsåtkomstor.

Regelbeskrivning

Att tilldela en egenskap till sig själv i sin uppsättningsåtkomst leder till en oändlig kedja av rekursiva anrop till den inställda åtkomstorn. Detta resulterar i en StackOverflowException vid körning. Ett sådant misstag är vanligt när egenskapen och bakgrundsfältet för att lagra egenskapsvärdet har liknande namn. I stället för att tilldela värdet till bakgrundsfältet tilldelades det av misstag till själva egenskapen.

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

Om du vill åtgärda överträdelser ersätter du tilldelningen som bryter mot egenskapen med antingen en tilldelning till bakgrundsfältet eller växlar till att använda en automatisk egenskap. Följande kodfragment visar till exempel ett brott mot regeln och ett par sätt att åtgärda den:

public class C
{
    // Backing field for property 'P'
    private int p;

    public int P
    {
        get
        {
            return p;
        }
        set
        {
            // CA2011: Accidentally assigned to property, instead of the backing field.
            P = value;
        }
    }
}
public class C
{
    // Backing field for property 'P'
    private int _p;

    public int P
    {
        get
        {
            return _p;
        }
        set
        {
            // Option 1: Assign to backing field and rename the backing field for clarity.
            _p = value;
        }
    }
}
public class C
{
    // Option 2: Use auto-property.
    public int P { get; set; }
}

När du ska ignorera varningar

Det går bra att förhindra överträdelser från den här regeln om du är säker på att de rekursiva anropen till den inställda åtkomstorn är villkorligt skyddade för att förhindra oändlig rekursion.

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

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

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

Se även