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

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

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

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