C # почему я должен использовать ключевое слово "new" при подписке на событие? - PullRequest
4 голосов
/ 13 октября 2011

В чем разница между следующими двумя способами подписки на событие?

receiver.ConfigChanged += Config_ConfigChanged;

receiver.ConfigChanged += new EventHandler(Config_ConfigChanged);

Кажется, что они оба работают одинаково, но если да, то какой смысл использовать второй?

А как насчет отмены подписки, оба следующих метода будут работать одинаково?

receiver.ConfigChanged -= Config_ConfigChanged;

receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);

Ответы [ 4 ]

12 голосов
/ 13 октября 2011

Подробный способ работает во всех версиях C #, короткий путь только в C # 2 и более поздних версиях.Поэтому я не вижу причин использовать длинный путь в наше время.

В некоторых ситуациях вам все еще нужно использовать new DelegateType(methodGroup), но подписка на события не является одной из них.Эти ситуации обычно включают вывод обобщенного типа или перегрузку метода.

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

2 голосов
/ 13 октября 2011

Событие автозаполнения Visual Studio TAB всегда по умолчанию соответствует способу .Net 1.0, независимо от того, какую версию фреймворка вы используете. Вы можете найти некоторых людей, которые привыкли читать старые способы ведения дел. Я только сталкивался с менее многословным путем использования Resharper!

Вот статья MSDN о подписке на события - там говорится, что именно @CodeInChaos только что подтвердил: http://msdn.microsoft.com/en-us/library/ms366768%28v=vs.80%29.aspx

0 голосов
/ 13 октября 2011

Хорошо, поэтому

receiver.ConfigChanged -= Config_ConfigChanged;

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

var eventHandler = new EventHandler(Config_ConfigChanged); 

receiver.ConfigChanged += eventHandler;
receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); 

receiver -= eventHandler;

очистит только один eventHandler.

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

0 голосов
/ 13 октября 2011

Поправь меня, если я не прав, но я не знаю, работает ли это

receiver.ConfigChanged += new EventHandler(Config_ConfigChanged);
receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);

Так как это 2 разных экземпляра Я думаю, что это будет

var configChanged = new EventHandler(Config_ConfigChanged);
receiver.ConfigChanged += configChanged;
receiver.ConfigChanged -= configChanged;

Но опять же, почему бы просто не использовать

receiver.ConfigChanged += Config_ConfigChanged;
receiver.ConfigChanged -= Config_ConfigChanged;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...