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

Viz také