реализует Equals, так что это всегда так:

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

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

private void MyEventHandler()
{}

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

MyObject.MyEvent += new Action(MyEventHandler);

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

MyObject.MyEvent += MyEventHandler;

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

 R. Martinho Fernandes13 янв. 2011 г., 04:07
Отлично, два совершенно противоположных ответа. Теперь мне любопытно.
 nawfal06 июл. 2014 г., 22:15

Ответы на вопрос(2)

Решение Вопроса

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

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

верить что, хотя вы можете отписаться от второго, вы не сможете отписаться от первого.

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

Обновить

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

public event Action MyEvent;

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

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

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

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

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

 Bradley Smith13 янв. 2011 г., 04:15
Это также согласуется с моими наблюдениями. Чтобы отказаться от подписки с использованием первого синтаксиса, необходимо сохранить экземпляр делегата в переменной перед его присоединением, а затем ссылаться на эту переменную при отмене подписки. Я никогда не понимал, почему VS продолжает использовать синтаксис обтекания, когда он предотвращает удаление обработчика событий ...
 Rick Sladkey13 янв. 2011 г., 04:52
@Bradley: это не мешает удалению.MulticastDelegate реализует Equals, так что это всегда так:new EventHandler(Handler) == new EventHandler(Handler).

Ваш ответ на вопрос