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