Определение обработчиков событий - PullRequest
4 голосов
/ 07 декабря 2009

Я могу определить событие как это (объявленная функция):

MyElement.Keyup +=MyDeclaredFunction

Я также могу определить это так (анонимный делегат):

MyElement.Keyup+=new delegate(object sender, eventargs e) {};

Я также могу определить это так (лямбда):

MyElement.Keyup += (sender, e) => myfunction

Каков наилучший способ сделать это? В одном случае код события находится вместе с объявлением события ... в другом они разделены.

Я предпочитаю метод 1

Может кто-нибудь сказать мне, какие плюсы и минусы каждого метода могут быть?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

Методы 2 и 3 одинаковы.

В методе 1 вы можете позже отказаться от подписки на событие. В методе 2 вы не можете отписаться от события. Я бы сказал, что это главное отличие.

2 голосов
/ 07 декабря 2009

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

Использование labdas и анонимных методов не позволяет нам делать это, если мы не назначаем анонимные методы или лямбда-выражения для делегирования переменных.

Я бы сказал, что одним из преимуществ использования декалирования в (1) является то, что метод будет объявлен в другом месте вашего класса, и это позволяет разработчику легко "сканировать" ваш код и обнаруживать методы обработчиков событий, тогда как анонимные методы и лямбды могут быть объявлены там, где они необходимы, и это может быть неочевидно без чтения кода метода, который их объявляет.

2 голосов
/ 07 декабря 2009

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

Второй и третий в значительной степени идентичны (по крайней мере, в C # 3.0) и действительно удобны для коротких блоков кода. На самом деле, есть 4-й вариант, полезный, если вам не нужны аргументы:

MyElement.Keyup+= delegate { /* code */ };

Заметьте, нам не нужно было объявлять аргументы (компилятор пишет совместимую подпись, которая просто не использует их). Вышеприведенный трюк, вероятно, не очень удобен для событий Click (я предполагаю, что для KeyUp вас интересует, какая клавиша была нажата, поэтому, вероятно, не используйте эту 1011 * в вашем сценарии).

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