Разработка событий

Обновлен: Ноябрь 2007

При наступлении события механизмы, его реализующие, позволяют выполняться определенному коду приложения. При наступлении события может вызываться либо предобработчик события, либо постобработчик события. Например, когда пользователь щелкает на кнопке в окне, вызывается постобработчик события, запускающий выполнение методов приложения. Обработчик событий связан с методом, который будет выполняться, когда система обнаружит событие. Обработчик событий добавляется к событию, так что становится возможным вызов его метода при обнаружении события. С событиями могут быть связаны дополнительные данные (например, событие перемещения мыши вниз может содержать данные о положении курсора на экране).

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

  • Тип возвращаемого значения — Void.

  • Первый параметр называется sender и имеет тип Object. Это объект, вызвавший событие.

  • Второй параметр называется e и имеет тип EventArgs или производный класс от EventArgs. Это данные, специфичные для события.

  • Этот метод принимает ровно два параметра.

Дополнительные сведения о событиях см. в разделе Обработка и вызов событий.

Вместо того чтобы вручную создавать новых делегатов, которые будут использованы в качестве обработчиков событий, используйте System.EventHandler<T>.

Данные рекомендации применимы, в основном, к новым возможностям. Если Вы расширяете функциональность в области, в которой уже используются специфичные обработчики событий, Вы можете продолжать их использовать в целях обеспечения преемственности.

Если версии библиотек платформы .NET Framework не поддерживают базовый тип, вы не можете следовать рекомендациям данного руководства.

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

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

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

Выполнение этих рекомендаций позволяет производным классам обрабатывать событие базового класса путем перегрузки защищенного метода. Имя защищенного метода virtual (Overridable в Visual Basic) должно быть таким же, как и имя события, и содержать префикс On. Например, защищенный виртуальный метод для события с именем TimeChanged имеет имя OnTimeChanged.

ms229011.alert_caution(ru-ru,VS.90).gifВажное примечание.

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

Используйте параметр, типом которого является класс аргумента события для защищенного метода, обрабатывающего событие. Параметр должен иметь имя e.

Класс FontDialog предоставляет следующий метод, который обрабатывает событие Apply:

Protected Overridable Sub OnApply( ByVal e As EventArgs )
protected virtual void OnApply(EventArgs e);

Не передавайте null (Nothing в Visual Basic) в качестве параметра "sender" при обработке нестатического события.

Для статических событий параметр sender должен быть null (Nothing в Visual Basic).

Не передавайте null (Nothing в Visual Basic) в качестве параметра "данные события" при обработке события.

Если данные события отсутствуют, передавайте Empty вместо null.

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

Рекомендуется размещать код обработки событий в блок "try-catch" для предотвращения завершения программы вследствие необработанных исключений, генерированных обработчиками событий.

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

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

Охраняется авторским правом Copyright 2005 Microsoft Corporation. Все права защищены.

Охраняется авторским правом Copyright Addison-Wesley Corporation. Все права защищены.

Дополнительные сведения о руководствах по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.

См. также

Основные понятия

Разработка настраиваемого обработчика событий

Другие ресурсы

Правила разработки членов

Руководство по разработке библиотек классов