Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.