Пользовательский EventHandler против EventHandler <EventArgs>

Недавно мне стало интересно, есть ли существенная разница между этим кодом:

public event EventHandler<MyEventArgs> SomeEvent;

И этот:

public delegate void MyEventHandler(object sender, MyEventArgs e);
public event MyEventHandler SomeEvent;

Они оба делают то же самое, и я не мог сказать никакой разницы. Хотя я заметил, что в большинстве классов .NET Framework используется специальный делегат обработчика событий для своих событий. Есть ли конкретная причина для этого?

Ответ 1

Вы правы; они делают то же самое. Таким образом, вы, вероятно, предпочтете первое по сравнению с последним, потому что оно более четкое и требует меньше ввода текста.

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

Ответ 2

Второй способ обеспечивает большую гибкость и безопасность типов. Существует меньше методов с соответствующей сигнатурой = > меньше места для ошибки. Пользовательский делегат позволяет указать точно нужные вам параметры (или указать никого) - нет отправителя + args груза.