CA1802. Используйте литералы там, где возможно
Свойство | Значение |
---|---|
Идентификатор правила | CA1802 |
Заголовок | По возможности используйте литералы |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Поле объявляется static
и readonly
(Shared
и ReadOnly
в Visual Basic) и инициализируется со значением, вычисляемым во время компиляции.
По умолчанию это правило проверяет только видимые извне статические поля только для чтения, но это поведение можно настроить.
Описание правила
Значение поля static readonly
вычисляется во время выполнения, когда вызывается статический конструктор для объявляющего типа. Если поле static readonly
инициализируется при объявлении и статический конструктор не объявлен явным образом, компилятор создает статический конструктор для инициализации поля.
Значение const
поля вычисляется во время компиляции и хранится в метаданных, что повышает производительность во время выполнения при сравнении с полем static readonly
.
Поскольку значение, присвоенное конечному полю, вычисляется во время компиляции, замените объявление полем const
, чтобы значение вычислялось не во время выполнения, а во время компиляции.
Устранение нарушений
Чтобы устранить нарушение этого правила, замените модификаторы static
и readonly
модификатором const
.
Примечание.
Использование модификатора const не рекомендуется для всех сценариев.
Когда лучше отключить предупреждения
Можно отключить предупреждение для этого правила или отключить правило, если производительность не важна.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
Эти параметры можно настроить только для этого правила, для всех правил, к которым она применяется, или для всех правил в этой категории (производительности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включение определенных контактных зон API
Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Обязательные модификаторы
Это правило можно настроить для переопределения обязательных модификаторов полей. По умолчанию static
и readonly
являются обязательными модификаторами для анализируемых полей. Это поведение можно заменить на разделенный запятыми список из одного или нескольких значений модификаторов из следующей таблицы:
Значение параметра | Итоги |
---|---|
none |
Нет требований к модификатору. |
static или Shared |
Должен быть объявлен как static (Shared в Visual Basic). |
const |
Должен быть объявлен как const. |
readonly |
Должен быть объявлен как readonly. |
Например, чтобы указать, что правило не должно выполняться для статических полей и полей экземпляра, добавьте следующую пару "ключ-значение" в файл .editorconfig в своем проекте:
dotnet_code_quality.CA1802.required_modifiers = none
Пример
В следующем примере показан тип UseReadOnly
, который нарушает правило, и тип UseConstant
, который удовлетворяет правилу.
Imports System
Namespace ca1802
' 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
// 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";
public void Print()
{
Console.WriteLine(s);
}
}
// This class satisfies the rule.
public class UseConstant
{
const int x = 3;
const double y = x + 2.1;
const string s = "const";
}