CA1802. Используйте литералы там, где возможно
Свойство | Значение |
---|---|
Идентификатор правила | CA1802 |
Заголовок | По возможности используйте литералы |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Поле объявляется static
и readonly
(Shared
и ReadOnly
в Visual Basic) и инициализируется со значением, вычисляемым во время компиляции.
По умолчанию это правило проверяет только видимые извне статические поля только для чтения, но это поведение можно настроить.
Описание правила
Значение поля static readonly
вычисляется во время выполнения, когда вызывается статический конструктор для объявляющего типа. Если поле static readonly
инициализируется при объявлении и статический конструктор не объявлен явным образом, компилятор создает статический конструктор для инициализации поля.
Значение const
поля вычисляется во время компиляции и хранится в метаданных, что повышает производительность во время выполнения при сравнении с полем static readonly
.
Поскольку значение, присвоенное конечному полю, вычисляется во время компиляции, замените объявление полем const
, чтобы значение вычислялось не во время выполнения, а во время компиляции.
Устранение нарушений
Чтобы устранить нарушение этого правила, замените модификаторы static
и readonly
модификатором const
.
Примечание.
Использование модификатора const не рекомендуется для всех сценариев.
Когда лучше отключить предупреждения
Можно отключить предупреждение для этого правила или отключить правило, если производительность не важна.
Предупреждение
Для общедоступных или внешних видимых членов изменение static readonly
на const
может привести к проблемам.
const
значения внедрены в зависимые сборки во время компиляции, поэтому изменения в значении библиотеки могут не распространяться, потенциально вызывая ошибки. Если значение элемента может измениться в будущем, отключите это правило.
Примечание.
Использование const
безопасно для private
членов и, как правило, безопасно для internal
членов, если они не предоставляются через InternalsVisibleTo
или развертываются отдельно.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#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_surface. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Примечание.
Замените XXXX
частью CAXXXX
идентификатором применимого правила.
Обязательные модификаторы
Это правило можно настроить для переопределения обязательных модификаторов полей. По умолчанию 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";
}