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


При необходимости использовать литералы

Обновлен: Ноябрь 2007

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