События и обратные вызовы
Примечание.
Это содержимое перепечатывается разрешением 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.