Ваш делегат не даст никаких указаний на то, что вызвало событие - нет эквивалента "отправителю".
Кроме того, если вы реализуете обработчик с подписью:
void Handler(object sender, EventArgs e)
тогда это может обработать любое событие, следующее за нормальным шаблоном, из-за дисперсии делегата. Таким образом, даже если вам не нужна информация из аргумента события, вы все равно можете подписаться на (скажем) событие Control.KeyPress
.
Теперь, если все события следуют одному и тому же шаблону, один обработчик может использоваться для нескольких событий, но вы не можете использовать его для обработки события с типом делегата Action
(который это в основном то, что соответствует вашему типу делегата - нет необходимости объявлять новый).
РЕДАКТИРОВАТЬ: учитывая ваш комментарий, я чувствую, что должен отметить, что ваш вопрос не охватывает различия между событиями и делегатами - он охватывает разницу между использованием «стандартного» типа делегата для событий и использованием «пользовательского» msgstr "тип делегата для событий. Разница между делегатами и событиями действительно заключается в инкапсуляции. У меня есть статья , которая может оказаться полезной для вас, хотя она охватывает в основном ту же тему, что и C # в Depth.