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