事件处理声明之间的差异
本文关键字:之间 声明 事件处理 | 更新日期: 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实现的匿名事件处理程序,因此您不能在以后的日期轻松取消订阅它。它的优点是简洁。