CA2211: I campi non costanti non devono essere visibili

Proprietà valore
ID regola CA2211
Title I campi non costanti non devono essere visibili
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

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

Descrizione regola

I campi statici che non sono costanti né in sola lettura non sono thread-safe. L'accesso a tale campo deve essere controllato attentamente e richiede tecniche di programmazione avanzate per sincronizzare l'accesso all'oggetto classe. Poiché queste sono competenze difficili da apprendere e il test di un oggetto di questo tipo pone le proprie sfide, i campi statici vengono usati meglio per archiviare i dati che non cambiano. Questa regola si applica alle librerie; le applicazioni non devono esporre campi.

Come correggere le violazioni

Per correggere una violazione di questa regola, impostare il campo statico costante o di sola lettura. Se non è possibile, riprogettare il tipo in modo da usare un meccanismo alternativo, ad esempio una proprietà thread-safe che gestisce l'accesso thread-safe al campo sottostante. Tenere presente che problemi quali conflitti di blocco e deadlock potrebbero influire sulle prestazioni e sul comportamento della libreria.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se si sviluppa un'applicazione e pertanto si ha il controllo completo sull'accesso al tipo che contiene il campo statico. Le finestre di progettazione della libreria non devono eliminare un avviso da questa regola; l'uso di campi statici non costanti può rendere difficile l'uso della libreria da parte degli sviluppatori.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un tipo che viola questa regola.


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