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 9 | 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.