Udostępnij za pośrednictwem


CA2011: Nie przypisuj właściwości w jej metodzie ustawiającej

Właściwości Wartość
Identyfikator reguły CA2011
Tytuł Nie przypisuj właściwości w ramach jej metody ustawiającej
Kategoria Niezawodność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako sugestia
Zastosowane języki C# i Visual Basic

Przyczyna

Właściwości przypadkowo przypisano wartość w obrębie własnego akcesora ustawiającego.

Opis reguły

Przypisanie właściwości do siebie w jego akcesorze set prowadzi do nieskończonego ciągu rekursywnych wywołań tego akcesora set. Powoduje to wystąpienie błędu w czasie wykonywania StackOverflowException. Taki błąd występuje często, gdy właściwość i pole wspierające używane do przechowywania jej wartości mają podobne nazwy. Zamiast przypisać wartość do pola pomocniczego, przez pomyłkę przypisano ją bezpośrednio do właściwości.

Jak naprawić naruszenia

Aby naprawić naruszenia, zastąp naruszające przypisanie do właściwości przypisaniem do pomocniczego pola lub przełącz się na użycie automatycznej właściwości. Na przykład poniższy fragment kodu przedstawia naruszenie reguły i kilka sposobów jego naprawy:

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; }
}

Kiedy pomijać ostrzeżenia

Można zignorować naruszenia tej reguły, jeśli masz pewność, że rekursywne wywołania akcesora są warunkowo chronione, aby zapobiec nieskończonej rekursji.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2011
// The code that's violating the rule is on this line.
#pragma warning restore CA2011

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA2011.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz też