CA1802: 適切な場所にリテラルを使用します

TypeName

UseLiteralsWhereAppropriate

CheckId

CA1802

分類

Microsoft.Performance

互換性に影響する変更点

なし

原因

フィールドが static および readonly (Visual Basic では Shared および ReadOnly) として宣言され、コンパイル時に計算できる値によって初期化されています。

規則の説明

宣言型の静的コンストラクターが呼び出されると、staticreadonly フィールドの値は実行時に計算されます。staticreadonly フィールドが宣言されるときに初期化され、静的コンストラクターが明示的に宣言されなかった場合、コンパイラは静的コンストラクターを出力してフィールドを初期化します。

const フィールドの値は、コンパイル時に計算され、メタデータに格納されます。その結果、staticreadonly フィールドに比べて実行時のパフォーマンスが向上します。

対象フィールドに代入された値はコンパイル時に計算できるので、宣言を const フィールドに変更して、値が実行時ではなくコンパイル時に計算されるようにします。

違反の修正方法

この規則の違反を修正するには、static 修飾子および readonly 修飾子を const 修飾子で置き換えます。

警告を抑制する状況

パフォーマンスを重視しない場合は、この規則による警告を抑制するか、または規則を無効にしても安全です。

使用例

この規則に違反している型 UseReadOnly と、規則に適合する型 UseConstant を次の例に示します。

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