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


CA1030: используйте события, где это уместно

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

Причина

Имя метода начинается с одного из следующего:

  • AddOn
  • RemoveOn
  • Огонь
  • Поднять

По умолчанию это правило проверяет только видимые извне методы, но это поведение можно настроить.

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

Данное правило обнаруживает методы, имена которых, как правило, используются для событий. События следуют за шаблоном разработки Observer или Publish-Subscribe; они используются, когда изменение состояния одного объекта должно быть донесено до других объектов. Если метод вызывается в ответ на четко определенное изменение состояния, то этот вызов должен осуществляться с помощью обработчика событий. Объекты, вызывающие методы, должны создавать события, а не вызывать методы напрямую.

Некоторые распространенные примеры событий находятся в приложениях пользовательского интерфейса, в которых пользовательское действие, например нажатие кнопки, приводит к выполнению сегмента кода. Модель событий .NET не ограничивается пользовательскими интерфейсами. Ее следует использовать в любом месте, где необходимо передать изменения состояния одному или нескольким объектам.

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

Если метод вызывается при изменении состояния объекта, попробуйте изменить структуру так, чтобы она использовала модель событий .NET.

Example

// This class violates the rule.
public class BadButton
{
    private readonly List<Action> _clickHandlers = new List<Action>();

    public void AddOnClick(Action handler)
    {
        // Some internal logic...

        _clickHandlers.Add(handler);
    }

    public void RemoveOnClick(Action handler)
    {
        // Some internal logic...

        _clickHandlers.Remove(handler);
    }

    public void FireClick()
    {
        foreach (Action handler in _clickHandlers)
        {
            handler();
        }
    }
}

// This class satisfies the rule.
public class GoodButton
{
    private EventHandler? _clickHandler;

    public event EventHandler? ClickHandler
    {
        add
        {
            // Some internal logic...

            _clickHandler += value;
        }
        remove
        {
            // Some internal logic...

            _clickHandler -= value;
        }
    }

    protected virtual void OnClick(EventArgs e)
    {
        _clickHandler?.Invoke(this, e);
    }

    public void Click()
    {
        OnClick(EventArgs.Empty);
    }
}

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

Скройте предупреждение о нарушении этого правила, если метод не работает с моделью событий .NET.

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

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

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

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

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

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

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

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

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

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

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

dotnet_code_quality.CAXXXX.api_surface = private, internal

Заметка

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