Sdílet prostřednictvím


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