Я только что понял, что могу добавить обработчик событий двумя способами:
Рассмотрим обработчик событий следующим образом:
private void MyEventHandler()
{}
Способ 1: создание нового делегата
MyObject.MyEvent += new Action(MyEventHandler);
Способ 2: добавить обработчик событий без создания нового делегата
MyObject.MyEvent += MyEventHandler;
Есть ли разница между этими двумя реализациями, которую следует учитывать?
Ответ 1 · рейтинг 6 · Michael Stum
Разницы нет, сгенерированный IL одинаков. Более короткая форма была введена в .net/c# 2.0 в качестве функции удобства, хотя Visual Studio по-прежнему использует первую форму для автозавершения вкладок.
См. этот вопрос для получения дополнительной информации.
Ответ 2 · рейтинг 2 · Jay
Я полагаю, что, хотя вы можете отказаться от подписки на второй, вы не сможете отказаться от подписки на первый.
Это было бы довольно важным отличием. В любом случае, обернув его в Action, на самом деле ничего не получится.
Обновить
Ладно, кажется, я неправильно понял, что ты делаешь. Если событие объявлено как
public event Action MyEvent;
тогда две подписки эквивалентны, причем вторая является сокращением от первой.
На самом деле есть и другие способы добавить обработчики событий:
MyObject.MyEvent += delegate { MyEventHandler(); };
MyObject.MyEvent += () => MyEventHandler();
В этих случаях вы не сможете отказаться от подписки. В этих примерах делегаты вызывают метод обработчика, но обычно при использовании этого метода нужно избегать создания отдельных методов обработчика - код обработчика идет прямо в анонимный метод.