Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | 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 идентификатором применимого правила.