Должен ли EventHandler всегда использоваться для событий? - PullRequest
4 голосов
/ 28 января 2011

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

У меня есть несколько хороших помощников по расширению для Action и EventHandler, что заставляет меня стремиться использовать эти предопределенные типы делегатов, а не мои собственные, но помимо этого ...

Есть ли иная причина, помимо соглашения, отдавать предпочтение EventHandler и EventHandler<T> перед пользовательскими типами делегатов или общими Action типами делегатов?

Ответы [ 3 ]

7 голосов
/ 28 января 2011

Основным преимуществом подписи EventHandler<T> по сравнению с использованием одного параметра для каждого члена вашего EventArgs является то, что вы можете добавить дополнительные свойства к вашему EventArgs без нарушения совместимости.
ИМО это самый важный аргумент. Возможность расширить свой EventArgs без нарушения кода подписки - это очень приятно. Но, конечно, вы можете добиться того же с любой сигнатурой, которая использует некоторый параметр свойства-пакета вместо параметра для свойства.

Тогда есть дисперсия, EventHandler<Base> преобразуется в EventHander<Derived>, поэтому вы можете написать EventHandler с параметром EventArgs и подписаться на события, которые имеют более конкретный EventArgs.

Методы расширения - еще один плюс, но вы уже упоминали об этом.

2 голосов
/ 28 января 2011

Нет, нет веской причины.

Если для ваших событий не требуется объект EventArgs или sender, вам не нужно использовать EventHandler или EventHandler<T>.

1 голос
/ 28 января 2011

Причина EventHandler заключается в том, что он поддерживает унифицированный способ работы с событиями.

Например, EventHandler всегда имеет sender, что очень удобно.

Практическое правило заключается в том, что при работе с WinForms и создании пользовательских элементов управления или расширении, например, Form, вы действительно должны использовать EventHandler. Для ваших собственных классов: сойти с ума.

...