在Windows窗体应用程序中,您可以注册这样的事件处理程序:
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
然后取消注册相同的处理程序:
this.KeyDown -= new KeyEventHandler(Form1_KeyDown);
对我来说这看起来很奇怪,因为我希望 - =要求最初注册的处理程序,而不是同一签名的第二个新处理程序。但根据经验,我知道这是有效的。这让我认为这是一个特例,实际上是
Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)
基于这个理论,我经常重写我的代码来注册和取消注册这样的事件:
this.KeyDown += Form1_KeyDown;
这样安全吗?或者这会产生一些我没有意识到的意外副作用吗?
答案 0 :(得分:4)
它完全相同,编译器知道它必须从事件类型创建KeyEventHandler委托的新实例。并自动为其生成代码。随意使用它,任何读取您代码的人都清楚它。
即使使用 new 运算符的语句也是语法糖,MulticastDelegate构造函数接受两个参数,而不是语句建议的那个,目标( this < / em>)和方法。编译器自动计算出目标。了解事件订阅添加对对象的引用很重要,它是泄漏的常见来源。
+ =运算符也是语法糖,它被转换为对事件的 add 访问器方法的调用。同样, - =运算符转换为对 remove 访问器的调用。很多管道都是故意隐藏的。
最后但并非最不重要的是,你做错了。您应该覆盖表单的OnKeyDown()方法。一个类听它自己的事件没有意义,它们是用于其他不相关的代码。那有点不走运。