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


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