new KeyEventHandler(Form1_KeyDown)和Form1_KeyDown的区别
本文关键字:KeyDown Form1 区别 new KeyEventHandler | 更新日期: 2023-09-27 17:53:43
在windows窗体应用程序中,您可以像这样注册事件处理程序:
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
然后注销相同的处理程序,如下所示:
this.KeyDown -= new KeyEventHandler(Form1_KeyDown);
对我来说,这似乎很奇怪,因为我希望-=需要最初注册的相同处理程序,而不是相同签名的第二个新处理程序。但从经验来看,我知道这是有效的。这使我认为这是一个特殊的情况,在现实中
Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)
基于这个理论,我经常重写我的代码来注册和取消注册事件,像这样:
this.KeyDown += Form1_KeyDown;
这安全吗?还是会有我没意识到的副作用?
这是相同的,编译器知道它必须从事件类型创建一个新的KeyEventHandler委托实例。并自动生成代码。请随意使用它,它对任何读你代码的人来说都是非常清楚的。
即使带有new操作符的语句也是语法糖,MulticastDelegate构造函数接受两个参数,而不是语句所建议的一个参数,即目标(this)和方法。编译器自动计算出目标。了解事件订阅向对象添加引用是很重要的,这是泄漏的常见来源。
+=操作符也是语法糖,它被转换为调用事件的add访问器方法。类似地,-=操作符被转换为对remove访问器的调用。很多管道是故意隐藏的。
最后但并非最不重要的是,你做错了。你应该重写表单的OnKeyDown()方法。一个类监听自己的事件是没有意义的,它们是为其他不相关的代码准备的。