CA2011: Nepřiřazovat vlastnost v rámci jeho setter
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2011 |
Název | Nepřiřazujte vlastnost v rámci její metody setter |
Kategorie | Spolehlivost |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Vlastnost byla omylem přiřazena hodnota v rámci svého vlastního přístupového objektu sady.
Popis pravidla
Přiřazení vlastnosti v jejím objektu set vede k nekonečnému řetězu rekurzivních volání objektu set. StackOverflowException Výsledkem je doba běhu. Taková chyba je běžná, když vlastnost a záložní pole pro uložení hodnoty vlastnosti mají podobné názvy. Místo přiřazení hodnoty k záložnímu poli byla omylem přiřazena k samotné vlastnosti.
Jak opravit porušení
Chcete-li opravit porušení, nahraďte porušení přiřazení k vlastnosti buď přiřazením k záložnímu poli, nebo přepněte na použití automatické vlastnosti. Například následující fragment kódu ukazuje porušení pravidla a několik způsobů, jak ho opravit:
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; }
}
Kdy potlačit upozornění
Je v pořádku potlačit porušení tohoto pravidla, pokud jste si jisti, že rekurzivní volání do objektu set jsou podmíněně strážena, aby se zabránilo nekonečné rekurze.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2011
// The code that's violating the rule is on this line.
#pragma warning restore CA2011
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2011.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.