Использование лямбда-выражений для обработчиков событий
В настоящее время у меня есть страница, которая объявляется следующим образом:
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. Мой вопрос: есть ли какие-либо недостатки производительности или подводные камни, которые я должен учитывать при использовании метода лямбда для этого? Я предпочитаю это, поскольку это, конечно, более кратким, но я не хочу жертвовать результатами, чтобы использовать его. Спасибо.
Ответы
Ответ 1
Нет никаких последствий для производительности, поскольку компилятор переводит ваше лямбда-выражение в эквивалентный делегат. Лямбда-выражения - это не что иное, как языковая функция, которую компилятор переводит в тот же самый код, с которым вы работаете.
Компилятор преобразует код, который у вас есть, примерно так:
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
});
}
}
Ответ 2
По производительности он будет таким же, как именованный метод. Большая проблема заключается в следующем:
MyButton.Click -= (o, i) =>
{
//snip
}
Вероятно, он попытается удалить другую лямбда, оставив там оригинал. Итак, урок заключается в том, что это прекрасно, если вы также не хотите удалять обработчик.
Ответ 3
EventHandler handler = (s, e) => MessageBox.Show("Woho");
button.Click += handler;
button.Click -= handler;
Ответ 4
Отсутствие последствий для производительности, о которых я знаю или когда-либо сталкивался, насколько я знаю, его просто "синтаксический сахар" и компилируется с той же ролью, что и использование синтаксиса делегата и т.д.