C# Lambda表达式与事件处理程序的性能比较

5
Lambda与传统事件处理程序相比,在处理异步回调时有什么性能优势(如果有的话)?
我发现我更喜欢使用这种模式,因为它允许我访问方法级别的数据,并且不会在我的代码中留下大量方法。
this.Click += (s, e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString());};

3
我猜想,没有深入研究C#规范,Lambda表达式是编译器针对委托方法的语法糖,并在性能上没有明显差异。在你发布的特定代码中(显示消息框),性能基本上是无关紧要的。 - Robert Harvey
2个回答

6
一个lambda表达式只是由编译器创建的委托。在实际应用中,它将执行完全相同的操作。
从技术上讲,通常会有一个(极微小的)性能下降,因为会创建一个额外的类来处理闭包,而传统的“事件处理程序”通常只是调用事件的同一类上的委托引用。如果您没有关闭任何局部变量,则两者具有完全相同的性能特征。在您的情况下,没有生成额外的类,因为您没有关闭变量。
使用lambda表达式的主要缺点不是性能,而是无法取消订阅事件。

1
只有在需要的情况下才会创建额外的类 - 在给定的示例中不需要。 - Jon Skeet
@Jon:非常正确 - 我会进行编辑,使其更加明确。 - Reed Copsey
1
无法取消订阅可能导致一些非常难以跟踪的内存泄漏,我知道这是因为第一次决定使用lambda进行事件处理时它曾经困扰过我。 - juharr

3
如果你的lambda表达式不使用捕获的变量,那么它就相当于通过委托调用的静态方法。如果你的lambda表达式使用了捕获的变量,那么在幕后会为你创建一个对象(引用类型)。这会产生一次分配和随后的GC成本。在大多数情况下,影响会很小,特别是在用户界面框架中看起来像是点击事件的场景下(这种事件发生的速率对方法调用的选择没有任何影响)。

3
如果一个类型只捕获了"this",那么就不需要使用一个类型,此时编译器会创建一个实例方法,委托的目标对象将是"this"。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接