Производительность C # Lambda против обработчика событий - PullRequest
5 голосов
/ 23 марта 2011

Что если есть какие-либо преимущества в производительности использования Lambda для обработки асинхронных обратных вызовов по сравнению со старомодным обработчиком событий?

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

this.Click += (s, e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString());};

Ответы [ 2 ]

6 голосов
/ 23 марта 2011

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

Технически, часто происходит (невероятно незначительное) снижение производительности, так как создается дополнительный класс для обработки замыканий, где традиционный «обработчик события», как правило, представляет собой просто ссылку на делегат того же класса, который вызывает событие. Если вы не закроете какие-либо локальные переменные, они будут иметь одинаковые характеристики производительности. В вашем случае разница равна нулю, поскольку дополнительный класс не создается, поскольку вы не закрываете переменную.

Основным недостатком использования лямбды является не производительность, а невозможность отписаться от события.

3 голосов
/ 23 марта 2011

Если ваша лямбда не использует захваченные переменные, это эквивалентно статическому методу, который вызывается через делегат.Если ваша лямбда использует захваченные переменные, то объект (ссылочный тип) создается для вас за кулисами.Это влечет за собой распределение и последующую стоимость GC.В большинстве случаев эффект будет незначительным, особенно в вашем сценарии, который выглядит как событие щелчка в структуре пользовательского интерфейса (частота, с которой могут происходить такие события, слишком медленная, чтобы выбор вызова метода оказал какое-либо влияние).

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