Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA2011 |
| Title | Tilldela inte en egenskap inom dess set-metod |
| Kategori | Tillförlitlighet |
| Korrigeringen är antingen invasiv eller icke-invasiv | Oumbrytbar |
| Aktiverad som standard i .NET 10 | Som förslag |
| Tillämpliga språk | C# och Visual Basic |
Orsak
Ett attribut tilldelades av misstag ett värde inom sin egen set-åtkomstmetod.
Regelbeskrivning
Att tilldela en egenskap till sig själv i sin set-accessor leder till en oändlig kedja av rekursiva anrop till set-accessorn. 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.