CA2211: Niestałe pola nie powinny być widoczne
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2211 |
Tytuł | Pola niebędące stałymi nie powinny być widoczne |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Kluczowa |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Publiczne lub chronione pole statyczne nie jest stałe ani nie jest tylko do odczytu.
Opis reguły
Pola statyczne, które nie są ani stałe, ani tylko do odczytu, nie obsługują wielowątkowości. Dostęp do takiego pola musi być starannie kontrolowany i wymaga zaawansowanych technik programowania do synchronizowania dostępu do obiektu klasy. Ponieważ są to trudne umiejętności do nauki, a testowanie takiego obiektu stwarza własne wyzwania, pola statyczne najlepiej służą do przechowywania danych, które nie zmieniają się. Ta reguła dotyczy bibliotek; aplikacje nie powinny uwidaczniać żadnych pól.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, ustaw stałą pola statycznego lub tylko do odczytu. Jeśli nie jest to możliwe, przeprojektuj typ, aby użyć alternatywnego mechanizmu, takiego jak właściwość bezpieczna wątkowo, która zarządza bezpiecznym wątkowo dostępem do pola bazowego. Należy pamiętać, że problemy, takie jak rywalizacja o blokadę i zakleszczenia, mogą mieć wpływ na wydajność i zachowanie biblioteki.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli tworzysz aplikację i w związku z tym masz pełną kontrolę nad dostępem do typu zawierającego pole statyczne. Projektanci bibliotek nie powinni pomijać ostrzeżenia z tej reguły; Używanie niestałych pól statycznych może utrudnić deweloperom korzystanie z biblioteki.
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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie pokazano typ naruszający tę regułę.
Imports System
Namespace ca2211
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}