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