Лекция 5. События

Приложения Windows управляются сообщениями. Это значит, что приложение общается с Windows, a Windows — с приложением посредством предопределенных сообщений. Эти сообщения представляют собой структуры, содержащие различные порции информации, используемые приложением и самой Windows для того, чтобы определить, что нужно делать дальше. До появления таких библиотек, как MFC, и таких сред разработки, как Visual Basic, разработчику приходилось самому заботиться о том, как нужно обрабатывать приходящие сообщения. Visual Basic и .NET обертывают некоторые из этих входящих сообщений в нечто, называемое событиями. Если ваша программа должна реагировать на специфическое входящее сообщение, вы должны обработать соответствующее событие. Общий пример этого — когда пользователь щелкает на кнопке формы. При этом Windows посылает сообщение WM_MOUSECLICK обработчику событий кнопки (иногда называемому оконной процедурой, или WndProc). Для разработчиков .NET это выглядит как событие кнопки OnClick.

При разработке объектно-ориентированных приложений требуется другая форма взаимодействия объектов. Когда в одном из ваших объектов происходит что-то интересное, то, вероятно, другие объекты должны быть информированы об этом. И снова на помощь приходят события. Точно так же, как .NET Framework обертывает сообщения Windows в события, ваши приложения могут использовать события в качестве коммуникационных посредников между объектами.

Делегаты применяются в качестве средства формирования событий при получении приложением сообщений.

Одним из преимуществ дизайна событий в С# является то, что для их использования совершенно не обязательно что-либо знать о лежащем в их основе механизме делегирования. Поэтому мы начнем этот раздел с короткой дискуссии о событиях с точки зрения клиентского программного обеспечения. Мы сосредоточимся на том, как следует писать код, чтобы получить уведомления о событиях, не слишком беспокоясь о том, что происходит «за кулисами» — просто для того, чтобы продемонстрировать, насколько проста в действительности работа с событиями. После этого мы напишем пример, генерирующий события, и, сделав это, увидим, как работает связь между событиями и делегатами.

В данном контексте термин «событие» используется в двух разных смыслах. Во-первых, как некоторое интересующее нас происшествие, а во-вторых - как строго определенный объект на языке С# - объект, который обслуживает процесс уведомления. Используя этот термин далее, мы будем говорить о нем либо как о событии С#, либо, когда смысл очевиден из контекста, - как просто о событии.