CA1802: Utilizza valori letterali dove appropriato
Proprietà | valore |
---|---|
ID regola | CA1802 |
Title | Utilizza valori letterali dove appropriato |
Categoria | Prestazioni |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Un campo viene dichiarato static
e readonly
(Shared
e ReadOnly
in Visual Basic) e viene inizializzato con un valore calcolabile in fase di compilazione.
Per impostazione predefinita, questa regola esamina solo i campi statici, statici e di sola lettura, ma è configurabile.
Descrizione regola
Il valore di un static readonly
campo viene calcolato in fase di esecuzione quando viene chiamato il costruttore statico per il tipo dichiarante. Se il static readonly
campo viene inizializzato quando viene dichiarato e un costruttore statico non viene dichiarato in modo esplicito, il compilatore genera un costruttore statico per inizializzare il campo.
Il valore di un const
campo viene calcolato in fase di compilazione e archiviato nei metadati, migliorando le prestazioni di runtime rispetto a un static readonly
campo.
Poiché il valore assegnato al campo di destinazione è calcolabile in fase di compilazione, modificare la dichiarazione in un const
campo in modo che il valore venga calcolato in fase di compilazione anziché in fase di esecuzione.
Come correggere le violazioni
Per correggere una violazione di questa regola, sostituire i static
modificatori e readonly
con il const
modificatore .
Nota
L'uso del modificatore const non è consigliato per tutti gli scenari.
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola o disabilitare la regola, se le prestazioni non sono problematiche.
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 CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
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.CA1802.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Configurare il codice da analizzare
Usare le opzioni seguenti per configurare le parti della codebase in cui eseguire questa regola.
È possibile configurare queste opzioni solo per questa regola, per tutte le regole a cui si applica o per tutte le regole in questa categoria (prestazioni) a cui si applica. Per altre informazioni, vedere Opzioni di configurazione delle regole di qualità del codice.
Includere superfici API specifiche
È possibile configurare le parti della codebase in modo da eseguire questa regola in base all'accessibilità. Ad esempio, per specificare che la regola deve essere eseguita solo sulla superficie dell'API non pubblica, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Modificatori obbligatori
È possibile configurare questa regola per eseguire l'override dei modificatori di campo obbligatori. Per impostazione predefinita, static
e readonly
sono entrambi modificatori obbligatori per i campi analizzati. È possibile eseguire l'override di questa opzione in un elenco delimitato da virgole di uno o più valori di modificatore della tabella seguente:
Valore opzione | Riepilogo |
---|---|
none |
Nessun requisito del modificatore. |
static oppure Shared |
Deve essere dichiarato come 'static' ('Shared' in Visual Basic). |
const |
Deve essere dichiarato come "const". |
readonly |
Deve essere dichiarato come "readonly". |
Ad esempio, per specificare che la regola deve essere eseguita su campi statici e di istanza, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:
dotnet_code_quality.CA1802.required_modifiers = none
Esempio
Nell'esempio seguente viene illustrato un tipo, UseReadOnly
, che viola la regola e un tipo, UseConstant
, che soddisfa la regola.
Imports System
Namespace ca1802
' This class violates the rule.
Public Class UseReadOnly
Shared ReadOnly x As Integer = 3
Shared ReadOnly y As Double = x + 2.1
Shared ReadOnly s As String = "readonly"
End Class
' This class satisfies the rule.
Public Class UseConstant
Const x As Integer = 3
Const y As Double = x + 2.1
Const s As String = "const"
End Class
End Namespace
// This class violates the rule.
public class UseReadOnly
{
static readonly int x = 3;
static readonly double y = x + 2.1;
static readonly string s = "readonly";
public void Print()
{
Console.WriteLine(s);
}
}
// This class satisfies the rule.
public class UseConstant
{
const int x = 3;
const double y = x + 2.1;
const string s = "const";
}