CA2211: Nekonstantní pole by nemělo být viditelné
Název_typu |
NonConstantFieldsShouldNotBeVisible |
CheckId |
CA2211 |
Kategorie |
Microsoft.Usage |
Změnit rozdělení |
Rozdělení |
Příčina
Veřejné nebo chráněné statické pole není konstantní, ani není jen pro čtení.
Popis pravidla
Statické pole, která jsou konstanty ani jsou jen pro čtení není bezpečné podprocesy.Přístup k takové pole musí být pečlivě kontrolován a vyžaduje pokročilé programovací techniky pro synchronizaci přístupu k objektu třídy.Protože jsou obtížné dovednosti naučit a předlohy a testování takový objekt představuje vlastní výzvy, statické pole jsou nejvhodnější pro ukládání dat, která se nezmění.Toto pravidlo platí pro knihoven; aplikace nesmí vystavovat všechna pole.
Jak opravit porušení
Porušení tohoto pravidla opravíte proveďte statické pole konstantní nebo jen pro čtení.Pokud to není možné změnit návrh použít alternativní mechanismus například vlastnost podprocesu, který spravuje podprocesu přístup k podkladové pole typu.Uvědomíte, že problémy jako například zámků a zablokování může ovlivnit výkon a chování knihovny.
Při potlačení upozornění
Je bezpečné potlačí upozornění od tohoto pravidla, pokud vyvíjíte aplikaci a proto mají plnou kontrolu nad přístupem na typ, který obsahuje statické pole.Návrháři knihovny není by měl potlačit varování od tohoto pravidla; pomocí polí statické nekonstantní můžete provést pomocí knihovny pro vývojáře obtížné správně používat.
Příklad
Následující příklad ukazuje typ, který poruší toto pravidlo.
Imports System
Namespace UsageLibrary
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
using System;
namespace UsageLibrary
{
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;
}
}