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