事件处理声明之间的差异

本文关键字:之间 声明 事件处理 | 更新日期: 2023-09-27 18:14:47

我正在努力理解:

someObject.SomeEventName += OnEventHappend;
private void OnEventHappened(object sender, EventArgs e)
{
}

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

两者有区别吗?有关系吗?

事件处理声明之间的差异

第二个叫做"lambda"。这是一种创建匿名函数的方法。

除了第二个函数没有名称,因此不能在其他地方使用,而第一个函数有名称,可以在其他地方使用之外,实际上没有任何区别。

编译器最终将在该类中创建一个类和一个方法来表示lambda,因此从技术上讲,它将有一个名称,只是不允许在代码中使用它。

可能需要注意的最重要的一点是lambdas可以关闭变量。这是lambda主体引用其自身作用域之外的变量的地方,即:

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

同样的功能可以使用完全命名的方法来完成(毕竟编译器会在某些时候将代码重构为命名的方法/对象),但最终的结果将比在类中只使用一个新方法稍微复杂一些。

一个明显的区别是后者是作为语句lambda实现的匿名事件处理程序,因此您不能在以后的日期轻松取消订阅它。它的优点是简洁。