Разница между EventHandler и делегатом void () - PullRequest
2 голосов
/ 10 января 2010

Мне просто любопытно, для чего же нужен простой даже хэндлер. Я могу иметь:

event EventHandler blah;

или

delegate void Blah();
event Blah Blah1;

Есть ли какое-то преимущество использования EventHandlers, кроме экономии лишней строки кода?

Ответы [ 2 ]

5 голосов
/ 10 января 2010

EventHandler - это delegate с парой дополнительных параметров. Первый - это отправитель, то есть объект, вызвавший это событие, а второй - дополнительные данные события. Это просто последовательный шаблон, полезный для объявления событий. Не передавая отправителя в качестве аргумента, вы не можете легко определить, какой объект вызвал его, и это может привести к ненужному дублированию (копированию и вставке) кода. Если вы следуете стандартному шаблону событий, ваш обработчик событий может выполнять различные задачи в зависимости от свойства объекта, вызвавшего событие.

Кроме того, некоторые события несут дополнительную информацию, например, событие, набранное MouseEventHandler, передаст расположение указателя мыши во втором аргументе (MouseEventArgs) для использования вашим обработчиком событий. Хорошая вещь об этом шаблоне - то, что вы можете игнорировать вспомогательные данные, если ваш обработчик событий является общим и не нуждается в нем. Например, вы можете подключить метод с подписью EventHandler к событию MouseEventHandler (поскольку тип второго аргумента наследуется от EventArgs).

2 голосов
/ 10 января 2010

Ваш делегат не даст никаких указаний на то, что вызвало событие - нет эквивалента "отправителю".

Кроме того, если вы реализуете обработчик с подписью:

void Handler(object sender, EventArgs e)

тогда это может обработать любое событие, следующее за нормальным шаблоном, из-за дисперсии делегата. Таким образом, даже если вам не нужна информация из аргумента события, вы все равно можете подписаться на (скажем) событие Control.KeyPress.

Теперь, если все события следуют одному и тому же шаблону, один обработчик может использоваться для нескольких событий, но вы не можете использовать его для обработки события с типом делегата Action (который это в основном то, что соответствует вашему типу делегата - нет необходимости объявлять новый).

РЕДАКТИРОВАТЬ: учитывая ваш комментарий, я чувствую, что должен отметить, что ваш вопрос не охватывает различия между событиями и делегатами - он охватывает разницу между использованием «стандартного» типа делегата для событий и использованием «пользовательского» msgstr "тип делегата для событий. Разница между делегатами и событиями действительно заключается в инкапсуляции. У меня есть статья , которая может оказаться полезной для вас, хотя она охватывает в основном ту же тему, что и C # в Depth.

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