Использование лямбда-выражений для обработчиков событий - PullRequest
95 голосов
/ 17 марта 2010

У меня в настоящее время есть страница, которая объявлена ​​следующим образом:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += (o, i) =>
        {
            //snip
        }
    }
}

Я только недавно перешел на .NET 3.5 с версии 1.1, поэтому я привык писать обработчики событий вне Page_Load. Мой вопрос Есть ли какие-либо недостатки производительности или подводные камни, на которые я должен обратить внимание при использовании лямбда-метода для этого? Я предпочитаю это, поскольку это, конечно, более кратко, но я не хочу жертвовать производительностью, чтобы использовать это. Спасибо.

Ответы [ 4 ]

92 голосов
/ 17 марта 2010

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

Компилятор преобразует ваш код во что-то вроде этого:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += new EventHandler(delegate (Object o, EventArgs a) 
        {
            //snip
        });
    }
}
55 голосов
/ 17 марта 2010

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

MyButton.Click -= (o, i) => 
{ 
    //snip 
} 

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

38 голосов
/ 06 сентября 2010
EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
button.Click -= handler;
2 голосов
/ 17 марта 2010

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

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