将lambda表达式用于事件处理程序

时间:2010-03-17 18:56:41

标签: c# performance events lambda

我目前有一个声明如下的页面:

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

我最近才从1.1迁移到.NET 3.5,所以我习惯在Page_Load之外编写事件处理程序。我的问题是;在使用lambda方法时,我应该注意哪些性能缺陷或缺陷?我更喜欢它,因为它当然更简洁,但我不想牺牲性能来使用它。感谢。

4 个答案:

答案 0 :(得分:90)

由于编译器会将lambda表达式转换为等效的委托,因此没有性能影响。 Lambda表达式只不过是一种语言特性,编译器将其转换为您习惯使用的完全相同的代码。

编译器会将您拥有的代码转换为以下内容:

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
        });
    }
}

答案 1 :(得分:54)

性能方面与命名方法相同。当你执行以下操作时,最大的问题是:

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

它可能会尝试删除不同的lambda,将原始的lambda留在那里。所以经验教训是,除非你也希望能够删除处理程序,否则它很好。

答案 2 :(得分:36)

EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
button.Click -= handler;

答案 3 :(得分:2)

我没有意识到或曾经遇到任何性能影响,据我所知,它仅仅是“语法糖”并且编译成与使用委托语法等相同的东西。