При необходимости использовать литералы
Обновлен: Ноябрь 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";
}
}