CA2011: Nepřiřazujte vlastnost v jeho setteru

Vlastnost Hodnota
ID pravidla CA2011
Název Nepřiřazujte vlastnost v rámci její metody setter
Kategorie Spolehlivost
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

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 sobě samé v její přístupové metodě set vede k nekonečnému řetězci rekurzivních volání této metody. Výsledkem je StackOverflowException za běhu programu. 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 podkladovému poli byla omylem přiřazena k samotné vlastnosti.

Jak opravit porušení

Chcete-li opravit porušení, nahraďte porušující přiřazení k vlastnosti buď přiřazením k podkladovému poli, nebo přepněte na automatickou vlastnost. 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é