Share via


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 způsobující chybu nebo chybu způsobující chybu Narušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Veřejné nebo chráněné statické pole není konstantní ani jen 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 používal alternativní mechanismus, jako je vlastnost bezpečná pro přístup z více vláken, která spravuje přístup 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čit upozornění z tohoto pravidla; použití nestátných statických polí může ztížit použití knihovny, aby vývojáři mohli správně používat.

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