来自委托与 lambda 的事件

Event from delegate vs lambda

像这样创建 C# 事件处理程序有什么区别吗:

btnHey.Click += new EventHandler(delegate (object obj, EventArgs evn) { System.Diagnostics.Debug.Write("Hey"); });

还有这个:

btnHey.Click += (object obj, EventArgs evn) => System.Diagnostics.Debug.Write("Hey");

不,它们是等效的。实际上有六个选项需要考虑:

  • btnHey.Click += new EventHandler(delegate (object obj, EventArgs evn) { ... });
  • btnHey.Click += new EventHandler(MethodName);
  • btnHey.Click += delegate (object obj, EventArgs evn) { ... };
  • btnHey.Click += MethodName;
  • btnHey.Click += (object obj, EventArgs evn) => ...;(表达式主体 lambda)
  • btnHey.Click += (object obj, EventArgs evn) => { ... };(语句 lambda)

... 其中 MethodName 是具有适当签名的方法的名称。还可以推断 lambda 表达式的参数,从而产生更多选项...

就是否实际创建新的委托对象而言,它们之间可能存在一些细微差别。使用方法组转换 (MethodName) 的选项将 总是 创建一个新对象,至少在撰写本文时是这样。使用其他选项,编译器 可能 能够缓存委托对象并重用它 - 取决于它是否捕获 this 或局部变量。这几乎不重要,但在需要微优化的极少数情况下值得了解。