Condividi tramite


CA2211: I campi non costanti non devono essere visibili

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

Category

Microsoft.Usage

Breaking Change

Breaking

Causa

Un campo statico pubblico o protetto non è costante né in sola lettura.

Descrizione della regola

I campi statici che non sono costanti né in sola lettura non sono thread-safe. L'accesso a tali campi deve essere controllato attentamente e richiede tecniche di programmazione avanzate per la sincronizzazione dell'accesso all'oggetto classe. Poiché si tratta di competenze di difficile apprendimento e insegnamento e il test di tale oggetto presenta difficoltà, è consigliabile utilizzare i campi statici per archiviare dati non soggetti a modifica. Questa regola si applica alle librerie, mentre le applicazioni non devono esporre alcun campo.

Come correggere le violazioni

Per correggere una violazione di questa regola, rendere costante o di sola lettura il campo statico. Se questa operazione non è possibile, riprogettare il tipo in modo che utilizzi un meccanismo alternativo quale una proprietà thread-safe che gestisca l'accesso thread-safe al campo sottostante. Tenere presente che problemi quali conflitti di blocco e deadlock possono incidere sulle prestazioni e sul comportamento della libreria.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se si sta sviluppando un'applicazione e pertanto si dispone del controllo completo sull'accesso al tipo che contiene il campo statico. È oppotuno che i progettisti di librerie non escludano un avviso da questa regola. L'utilizzo di campi statici non costanti può rendere difficile il corretto utilizzo della libreria da parte degli sviluppatori.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola questa regola.


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