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