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


CA1822: помечайте члены как статические

Свойство Значение
Идентификатор правила CA1822
Заголовок Пометьте члены как статические
Категория Производительность
Исправление является критическим или не критическим Не нарушающий — если элемент не виден извне сборки, независимо от внесенных изменений.

Не критическое — если вы просто изменяете элемент на элемент экземпляра с ключевым словом this.

Критическое — при превращении элемента из элемента экземпляра в статический элемент, который является видимым за пределами сборки.
Включен по умолчанию в .NET 10 Как предложение
Применимые языки C# и Visual Basic

Причина

Элемент, не обращающийся к данным экземпляра, не помечается как статический (общий в Visual Basic).

Описание правила

Элементы, не обращающиеся к данным экземпляра и не вызывающие методы экземпляра, можно помечать как статические (общие в Visual Basic). Если пометить методы как статические, компилятор предоставит этим членам невиртуальные места вызова. Генерация невиртуальных вызовов предотвращает проверку во время выполнения каждого вызова, которая гарантирует, что текущий указатель объекта не является пустым. Это может обеспечить значительное повышение производительности при работе с кодом, для которого важна высокая производительность системы. В некоторых случаях сбой доступа к текущему экземпляру объекта означает проблему с корректностью.

Устранение нарушений

Пометьте элемент как статический (или общий в Visual Basic) или используйте "this"/"Me" в теле метода, если это уместно.

Example

public class Printer
{
    private readonly List<char> _items = [
        'H', 'e', 'l', 'l', 'o',
    ];

    public void PrintHello()
    {
        BadPrintHelloInternal();
        GoodPrintHelloInternal();
        GoodPrintHelloStaticInternal();
    }

    // This method violates the rule.
    private void BadPrintHelloInternal()
    {
        Console.WriteLine("Hello");
    }

    // This methods satisfies the rule.
    private void GoodPrintHelloInternal()
    {
        Console.WriteLine(string.Join(string.Empty, this._items));
    }

    private static void GoodPrintHelloStaticInternal()
    {
        Console.WriteLine("Hello");
    }
}

Когда лучше отключить предупреждения

Подавлять предупреждение этого правила безопасно в следующих случаях:

  • Для ранее отправленного кода, для которого исправление было бы критическим изменением.
  • Для методов в классах, наследующих от MarshalByRefObject. Методы в этих классах не должны быть помечены как статические, так как инфраструктура удаленного взаимодействия .NET использует отправку экземпляров для переадресации вызовов через границы AppDomain. Сделать такие методы статическими может нарушить удаленное взаимодействие через границы AppDomain.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1822
// The code that's violating the rule is on this line.
#pragma warning restore CA1822

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1822.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.

Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (производительности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включите конкретные поверхности API

Вы можете настроить компоненты базы кода для выполнения этого правила на основе их специальных возможностей, задав параметр api_surface. Например, чтобы указать, что правило должно выполняться только для непубличной поверхности API, добавьте следующую пару "ключ-значение" в файл .editorconfig в ваш проект:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Заметка

Замените XXXX частью CAXXXX идентификатором применимого правила.