C#Lambda与事件处理程序的性能

时间:2011-03-23 17:26:28

标签: c# performance lambda delegates

使用Lambda处理异步回调与旧式事件处理程序相比,性能优势是什么呢?

我发现我更多地使用这种模式,因为它允许我访问方法级数据,并且不会使用方法丢弃我的代码:

this.Click += (s, e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString());};

2 个答案:

答案 0 :(得分:6)

lambda只是一个由编译器创建的委托。实际上,它的表现完全一样。

从技术上讲,通常会有一个(令人难以置信的轻微)性能下降,因为创建了一个额外的类来处理闭包,传统的“事件处理程序”通常只是调用事件的同一个类的委托引用。如果不关闭任何局部变量,则两者将具有完全相同的性能特征。在您的情况下,由于您没有关闭变量,因此没有生成额外的类,因此存在零差异。

使用lambda的主要缺点不是性能,而是无法取消订阅事件。

答案 1 :(得分:3)

如果lambda不使用捕获的变量,则它等同于通过委托调用的静态方法。如果lambda确实使用捕获的变量,则会在后台为您创建一个对象(引用类型)。这会产生分配和随后的GC成本。在大多数情况下,效果可以忽略不计,特别是在您的场景中,它看起来像是用户界面框架中的单击事件(此类事件可能发生的速率太慢,方法调用选择不会产生任何影响)。 / p>