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