Udostępnij za pośrednictwem


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