来自委托与lambda的事件

c#

像这样创建 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还是局部变量。这几乎不重要,但在需要微优化的极少数情况下值得了解。


以上是来自委托与lambda的事件的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>