为事件处理程序使用 lambda 表达式

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

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 之外编写事件处理程序。我的问题是: 在使用 lambda 方法进行此操作时,是否有任何性能缺陷或陷阱需要注意?我更喜欢它,因为它当然更简洁,但我不想牺牲性能来使用它。谢谢。

135294 次浏览

由于编译器将把 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
});
}
}

据我所知,它没有任何性能影响,也没有遇到过任何性能影响,它只是“语法上的糖”,并且编译成与使用委托语法相同的东西,等等。

就性能而言,它与命名方法相同:

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

它可能会尝试删除一个不同的 lambda,留下原来的一个在那里。所以教训是,这是可以的,除非你也想能够删除处理程序。

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


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