Поделиться через


CA1802. Используйте литералы там, где возможно

TypeName

UseLiteralsWhereAppropriate

CheckId

CA1802

Категория

Microsoft.Performance

Критическое изменение

Не критическое

Причина

Поле объявлено static и readonly (Shared и ReadOnly в Visual Basic) и инициализировано со значением, вычисляемым во время компиляции.

Описание правила

Значение поля 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";
   }
}