Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: VeraxОтветов: 2

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

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

private void MyEventHandler()
{}

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

MyObject.MyEvent += new Action(MyEventHandler);

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

MyObject.MyEvent += MyEventHandler;

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

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

delegatesevent-handling

Ответы

Ответ 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();

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы