事件处理声明之间的区别?

时间:2013-05-22 17:57:23

标签: c# events lambda

我正在努力理解:

之间的区别
someObject.SomeEventName += OnEventHappend;

private void OnEventHappened(object sender, EventArgs e)
{
}

someOBject.SomeEventName += ( o, e) => { };

是否存在差异并且这种方式或其他方面都很重要。

2 个答案:

答案 0 :(得分:3)

第二个被称为“lambda”。这是一种创建匿名函数的方法。

除了第二个函数没有名称,因此不能在其他任何地方使用的事实,而第一个确实有一个名称而可以在其他地方使用,那里实际上没有任何差异。

编译器最终会在该类中创建一个类和一个方法来表示lambda,所以从技术上讲它将有一个名称,你不能在代码中使用它。

可能最重要的一点是lambda可以关闭变量。这就是lambda体在其自身范围之外的可变性,即:

int value = 5;

someObject.SomeEvent += (s,e) => { Console.WriteLine(value);};

使用完全命名的方法可以完成相同的功能(在所有编译器将在某些时候将该代码重构为命名的方法/对象之后),但最终结果将比类中的一个新方法稍微复杂一些。 / p>

答案 1 :(得分:1)

一个显而易见的区别是,后者是一个匿名事件处理程序,作为一个statment lambda实现,所以你不能轻易取消订阅它。它的优点是它的简洁。