Udostępnij za pośrednictwem


CA1802: Używaj literałów wszędzie, gdzie jest to odpowiednie

TypeName

UseLiteralsWhereAppropriate

CheckId

CA1802

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Pole jest zadeklarowane jako static i readonly (Shared i ReadOnly w Visual Basic) i jest zainicjowane wartością, która jest obliczana w czasie kompilacji.

Opis reguły

Wartość pola staticreadonly jest obliczana w czasie wykonywania, gdy wywoływany jest konstruktor statyczny dla deklarowanego typu.Jeśli pole staticreadonly jest inicjowane, gdy jest zadeklarowane a konstruktor statyczny nie jest zadeklarowany jawnie, kompilator generuje konstruktor statyczny aby zainicjować pola.

Wartość pola const jest obliczana w czasie kompilacji i przechowywana w metadanych, co zwiększa wydajność w czasie wykonywania w porównaniu do pola staticreadonly.

Ponieważ wartość, przypisana do pola docelowego jest obliczalna w czasie kompilacji, należy zmienić deklarację na pole const, dzięki czemu wartość jest obliczana w czasie kompilacji, zamiast w czasie wykonywania.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zastąpić modyfikatory static i readonly modyfikatorem const.

Kiedy pominąć ostrzeżenia

Jest bezpieczne, aby pomijać ostrzeżenia od tej reguły lub wyłączyć regułę, jeśli wydajność nie jest problemem.

Przykład

Poniższy przykład pokazuje typ, UseReadOnly który narusza regułę oraz typ, UseConstant, który spełnia regułę.

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