CA2211: Nekonstantní pole by nemělo být viditelné

Vlastnost Hodnota
ID pravidla CA2211
Název Nekonstantní pole by neměla být viditelná
Kategorie Využití
Oprava, která může být destruktivní nebo nedestruktivní Přerušující
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Veřejné nebo chráněné statické pole není ani konstantní, ani pouze pro čtení.

Popis pravidla

Statická pole, která nejsou konstantami ani nejsou jen pro čtení, nejsou bezpečná pro přístup z více vláken. Přístup k takovému poli musí být pečlivě řízen a vyžaduje pokročilé programovací techniky pro synchronizaci přístupu k objektu třídy. Vzhledem k tomu, že se tyto dovednosti obtížně učí a testování takového objektu představuje vlastní výzvy, statická pole se nejlépe používají k ukládání dat, která se nemění. Toto pravidlo platí pro knihovny; aplikace by neměly zveřejnit žádná pole.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, nastavte konstantu statického pole nebo jen pro čtení. Pokud to není možné, přepracujte typ tak, aby využíval alternativní mechanismus, například vlastnost zajišťující bezpečný přístup z více vláken k podkladovému poli. Uvědomte si, že problémy, jako jsou kolize zámků a vzájemné zablokování, můžou ovlivnit výkon a chování knihovny.

Kdy potlačit upozornění

Pokud vyvíjíte aplikaci, je bezpečné potlačit upozornění z tohoto pravidla, a proto máte úplnou kontrolu nad přístupem k typu, který obsahuje statické pole. Návrháři knihoven by neměli potlačovat upozornění vydané tímto pravidlem; použití nestálých statických polí může ztížit vývojářům správné použití knihovny.

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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

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.CA2211.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující příklad ukazuje typ, který porušuje toto pravidlo.


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