Обзор событий (Windows Forms .NET)
Событие — это действие, на которое можно реагировать или "обрабатывать" в коде. События могут создаваться действием пользователя, например щелчком мыши или нажатием клавиши, кодом программы или системой.
Приложения, управляемые событиями, выполняют код в ответ на событие. Каждая форма и элемент управления предоставляют предопределенный набор событий, которые вы можете использовать для программирования. Если происходит одно из этих событий и есть код связанного обработчика событий, вызывается этот код.
Типы событий, создаваемые объектом, различаются, но многие типы являются общими для большинства элементов управления. Например, большинство объектов обрабатывает событие Click. Если пользователь щелкает форму, выполняется код в Click обработчике событий формы.
Заметка
Многие события происходят в сочетании с другими событиями. Например, в ходе события DoubleClick происходят события MouseDown, MouseUpи Click.
Сведения о том, как инициировать и обрабатывать событие, см. в разделе Обработка и инициирование событий.
Делегаты и их роль
Делегаты — это классы, часто используемые в .NET для создания механизмов обработки событий. Делегаты примерно приравниваются к указателям функций, часто используемым в Visual C++ и других объектно-ориентированных языках. В отличие от указателей функций, делегаты обладают объектно-ориентированностью, типобезопасностью и безопасностью. Кроме того, где указатель функции содержит только ссылку на определенную функцию, делегат состоит из ссылки на объект и ссылки на один или несколько методов в объекте.
Эта модель событий использует делегатов для привязки событий к методам, используемым для их обработки. Делегат позволяет другим классам регистрировать уведомления о событиях, указывая метод обработчика. При возникновении события делегат вызывает привязанный метод. Дополнительные сведения о том, как определить делегатов, см. в разделе Обработка и генерация событий.
Делегаты могут быть привязаны к одному методу или нескольким методам, называемым многоадресной рассылкой. При создании делегата для события обычно создается мультиметодное событие. Редкое исключение может быть событием, которое приводит к определенной процедуре (например, отображению диалогового окна), которая не будет логически повторяться несколько раз на событие. Сведения о создании многопотокового делегата см. в способах объединения делегатов (многопотоковые делегаты).
Делегат многоадресной рассылки поддерживает список вызовов методов, к которым он привязан. Делегат многоадресной рассылки поддерживает метод Combine для добавления метода в список вызовов и метода Remove для его удаления.
Когда событие записывается приложением, элемент управления вызывает событие путем вызова делегата для этого события. Делегат в свою очередь вызывает привязанный метод. В наиболее распространённом случае (многоадресный делегат) делегат вызывает каждый связанный метод в списке вызовов по очереди, что обеспечивает уведомление "от одного ко многим". Эта стратегия означает, что элемент управления не должен поддерживать список целевых объектов для уведомления о событиях, поскольку делегат берет на себя обработку всех регистраций и рассылку уведомлений.
Делегаты также позволяют привязать несколько событий к одному методу, что позволяет получать уведомление "многие к одному". Например, событие нажатия кнопки и событие нажатия меню может вызывать один и тот же делегат, который затем вызывает один метод для обработки этих отдельных событий так же.
Механизм привязки, используемый с делегатами, является динамическим: делегат может быть привязан во время выполнения к любому методу, подпись которого соответствует обработчику событий. С помощью этой функции можно настроить или изменить привязанный метод в зависимости от условия и динамически подключить обработчик событий к элементу управления.
См. также
.NET Desktop feedback