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


Конструктор событий

Замечание

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

События являются наиболее часто используемой формой обратных вызовов (конструкции, позволяющие платформе вызывать код пользователя). Другие механизмы обратного вызова включают члены, принимающие делегаты, виртуальные члены и подключаемые модули на основе интерфейса. Данные исследований по удобству использования показывают, что большинство разработчиков предпочитают использовать события, нежели другие механизмы обратного вызова. События хорошо интегрированы с Visual Studio и многими языками.

Важно отметить, что существует две группы событий: события, создаваемые до изменения состояния системы, называемые предварительными событиями и событиями, вызванными изменениями состояния, называемыми событиями после изменений состояния. Примером предварительного события будет Form.Closing, которое возникает перед закрытием формы. Примером события после выполнения может быть Form.Closed, которое возникает после закрытия формы.

✔️ Используйте термин "вызвать" для событий, а не "сработать" или "инициировать".

✔️ Используйте System.EventHandler<TEventArgs> вместо ручного создания новых делегатов для использования в качестве обработчиков событий.

✔️ Рассмотрите использование подкласса EventArgs в качестве аргумента события, если вы абсолютно уверены, что событие не будет переносить какие-либо данные в метод обработки событий, в противном случае можно использовать тип EventArgs напрямую.

Если вы отправляете API напрямую с помощью EventArgs, вы никогда не сможете добавлять данные, которые будут передаваться вместе с событием, не нарушая совместимости. Если вы используете подкласс, даже если изначально полностью пусто, вы сможете добавлять свойства в подкласс при необходимости.

✔️ Используйте защищенный виртуальный метод для вызова каждого события. Это применимо только к нестатическим событиям в незапечатанных классах, а не для структур, запечатанных классов или статических событий.

** Цель метода — предоставить производному классу возможность обработки события через переопределение. Переопределение — это более гибкий, быстрый и более естественный способ обработки событий базового класса в производных классах. По соглашению имя метода должно начинаться с "Вкл." и следовать имени события.

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

✔️ Передайте один параметр в защищенный метод, который вызывает событие.

Параметр должен быть назван e и должен быть введен в качестве класса аргументов события.

❌ НЕ передайте значение NULL в качестве отправителя при возникновении нестатического события.

✔️ Do передает значение NULL в качестве отправителя при вызове статического события.

❌ Не передайте значение NULL в качестве параметра данных события при вызове события.

Если вы не хотите передавать данные в метод обработки событий, следует передать EventArgs.Empty. Разработчики ожидают, что этот параметр не должен иметь значение NULL.

✔️ Рассмотрите возможность вызывать события, которые конечный пользователь может отменять. Это относится только к предварительным событиям.

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

Дизайн пользовательского обработчика событий

Существуют случаи, в которых EventHandler<T> нельзя использовать, например, когда платформа должна работать с более ранними версиями среды CLR, которая не поддерживала универсальные шаблоны. В таких случаях может потребоваться спроектировать и разработать делегат пользовательского обработчика событий.

✔️ Используйте возвращаемый тип void для обработчиков событий.

Обработчик событий может вызывать несколько методов обработки событий, возможно, на нескольких объектах. Если методы обработки событий были разрешены возвращать значение, для каждого вызова события будет несколько возвращаемых значений.

Используйте object в качестве типа первого параметра обработчика событий и назовите его sender.

✔️ DO использует System.EventArgs или его подкласс в качестве типа второго параметра обработчика событий и вызывает его e.

❌ Не используйте более двух параметров в обработчиках событий.

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также