Должен ли я создавать новый делегат или нет?

Я только что понял, что могу добавить обработчик событий двумя способами:

Рассмотрим обработчик событий следующим образом:

private void MyEventHandler()
{}

Способ 1: создание нового делегата

MyObject.MyEvent += new Action(MyEventHandler);

Способ 2: добавить обработчик событий без создания нового делегата

MyObject.MyEvent += MyEventHandler;

Есть ли разница между этими двумя реализациями, которую следует учитывать?


person Verax    schedule 13.01.2011    source источник
comment
Отлично, два совершенно противоположных ответа. Теперь мне любопытно.   -  person R. Martinho Fernandes    schedule 13.01.2011
comment
возможный дубликат C#: разница между '+= anEvent' и '+= new EventHandler (событие)'   -  person nawfal    schedule 07.07.2014


Ответы (2)


Разницы нет, сгенерированный IL одинаков. Более короткая форма была введена в .net/c# 2.0 в качестве функции удобства, хотя Visual Studio по-прежнему использует первую форму для автозавершения вкладок.

См. этот вопрос для получения дополнительной информации.

person Michael Stum    schedule 13.01.2011

Я полагаю, что, хотя вы можете отказаться от подписки на второй, вы не сможете отказаться от подписки на первый.

Это было бы довольно важным отличием. В любом случае, обернув его в Action, на самом деле ничего не получится.

Обновить

Ладно, кажется, я неправильно понял, что ты делаешь. Если событие объявлено как

public event Action MyEvent;

тогда две подписки эквивалентны, причем вторая является сокращением от первой.

На самом деле есть и другие способы добавить обработчики событий:

MyObject.MyEvent += delegate { MyEventHandler(); };

MyObject.MyEvent += () => MyEventHandler();

В этих случаях вы не сможете отказаться от подписки. В этих примерах делегаты вызывают метод обработчика, но обычно при использовании этого метода нужно избегать создания отдельных методов обработчика — код обработчика идет прямо в анонимный метод.

person Jay    schedule 13.01.2011
comment
Это согласуется и с моими наблюдениями. Чтобы отказаться от подписки, используя первый синтаксис, вы должны сохранить экземпляр делегата в переменной перед его присоединением, а затем ссылаться на эту переменную при отмене подписки. Я никогда не понимал, почему VS продолжает использовать синтаксис упаковки, когда он предотвращает удаление обработчика событий... - person Bradley Smith; 13.01.2011
comment
@Bradley: это не мешает удалению. MulticastDelegate реализует Equals, поэтому это всегда верно: new EventHandler(Handler) == new EventHandler(Handler). - person Rick Sladkey; 13.01.2011