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


События и обратные вызовы

Примечание.

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

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

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

✔️ РАССМОТРИТЕ возможность использования обратных вызовов, чтобы разрешить пользователям предоставлять пользовательский код, который будет выполняться платформой.

✔️ РАССМОТРИТЕ возможность использования событий, чтобы разрешить пользователям настраивать поведение платформы без необходимости понимания объектно-ориентированного проектирования.

✔️ОТДАВАЙТЕ ПРЕДПОЧТЕНИЕ событиям, а не простым обратным вызовам, так как они более понятны для большинства разработчиков и интегрированы с возможностью завершения операторов Visual Studio.

❌ ИЗБЕГАЙТЕ использования обратных вызовов в интерфейсах API, зависящих от производительности.

✔️ При определении API с обратными вызовами вместо пользовательских делегатов используйте новые типы Func<...>, Action<...> или Expression<...>.

Func<...> и Action<...> представляют универсальные методы-делегаты. Expression<...> представляет определения функций, которые могут быть скомпилированы и впоследствии вызваны во время выполнения, но также могут быть сериализованы и переданы в удаленные процессы.

✔️ ИЗМЕРЯЙТЕ и изучайте влияние на производительность при использовании Expression<...> вместо делегатов Func<...> и Action<...>.

Типы Expression<...> в большинстве случаев логически эквивалентны делегатам Func<...> и Action<...>. Основное различие между ними заключается в том, что делегаты предназначены для использования в сценариях локальных процессов, а выражения предназначены для случаев, когда целесообразно и возможно оценить выражение в удаленном процессе или на компьютере.

✔️ ПОЙМИТЕ, что вызвав делегат, вы выполняете произвольный код, который может повлиять на безопасность, корректность работы и совместимость.

Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.

Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.

См. также