CA1802: Utilizza valori letterali dove appropriato
TypeName |
UseLiteralsWhereAppropriate |
CheckId |
CA1802 |
Category |
Microsoft.Performance |
Breaking Change |
Non sostanziale |
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.
Descrizione della regola
Il valore di un campo staticreadonly viene calcolato in fase di esecuzione quando viene chiamato il costruttore statico per il tipo dichiarante.Se il campo staticreadonly viene inizializzato al momento della dichiarazione e un costruttore statico non viene dichiarato esplicitamente, il compilatore crea un costruttore statico per inizializzare il campo.
Il valore di un campo const viene calcolato in fase di compilazione e memorizzato nei metadati, aumentando in tal modo le prestazioni in fase di runtime in confronto a un campo staticreadonly.
Dal momento che il valore assegnato al campo di destinazione è calcolabile in fase di compilazione, modificare la dichiarazione in un campo const in modo che il calcolo del valore venga effettuato in fase di compilazione invece che in fase di esecuzione.
Come correggere le violazioni
Per correggere un violazione di questa regola, sostituire i modificatori static e readonly con il modificatore const.
Esclusione di avvisi
L'esclusione di un avviso da questa regola, così come la disattivazione della regola, è sicura se le prestazioni non costituiscono un problema.
Esempio
Nell'esempio riportato di seguito vengono illustrati un tipo UseReadOnly che viola la regola e un tipo UseConstant che la soddisfa.
Imports System
Namespace PerformanceLibrary
' 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
using System;
namespace PerformanceLibrary
{
// 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";
}
// This class satisfies the rule.
public class UseConstant
{
const int x = 3;
const double y = x + 2.1;
const string s = "const";
}
}