Должен ли я создать новый делегат или нет? - PullRequest
6 голосов
/ 13 января 2011

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

Рассмотрим обработчик событий примерно так:

private void MyEventHandler()
{}

Метод 1: создание нового делегата

MyObject.MyEvent += new Action(MyEventHandler);

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

MyObject.MyEvent += MyEventHandler;

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

Ответы [ 2 ]

6 голосов
/ 13 января 2011

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

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

2 голосов
/ 13 января 2011

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

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

update

Хорошо, я думаю, что неправильно понял, что вы делали.Если событие объявлено как

public event Action MyEvent;

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

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

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

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

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

...