Delen via


CA2011: Wijs geen eigenschap toe binnen de setter

Eigenschappen Weergegeven als
Regel-id CA2011
Titel Wijs geen eigenschap toe binnen de setter
Categorie Betrouwbaarheid
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Aan een eigenschap is per ongeluk een waarde toegewezen binnen een eigen set accessor.

Beschrijving van regel

Het toewijzen van een eigenschap aan zichzelf in de settoegangsor leidt tot een oneindige keten van recursieve aanroepen naar de settoegangsor. Dit resulteert in een StackOverflowException runtime. Een dergelijke fout komt vaak voor wanneer de eigenschap en het backing-veld voor het opslaan van de eigenschapswaarde vergelijkbare namen hebben. In plaats van de waarde toe te wijzen aan het backingveld, is deze per ongeluk toegewezen aan de eigenschap zelf.

Schendingen oplossen

Als u schendingen wilt oplossen, vervangt u de schending van de toewijzing aan de eigenschap door een toewijzing aan het backing-veld of schakelt u over naar het gebruik van een automatische eigenschap. In het volgende codefragment ziet u bijvoorbeeld een schending van de regel en een aantal manieren om dit op te lossen:

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

Wanneer waarschuwingen onderdrukken

Het is prima om schendingen van deze regel te onderdrukken als u zeker weet dat de recursieve aanroepen naar de settoegangsor voorwaardelijk worden beveiligd om oneindige recursie te voorkomen.

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

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Zie ook