Condividi tramite


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 static readonly viene calcolato in fase di esecuzione quando viene chiamato il costruttore statico per il tipo dichiarante. Se il campo static readonly 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 static readonly.

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