Бөлісу құралы:


CA1802: Используйте литералы, где это уместно.

Свойство Значение
Идентификатор правила CA1802
Заголовок По возможности используйте литералы, где это уместно.
Категория Производительность
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

Поле объявляется 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";
}