2

在 Windows 窗体应用程序中,您可以像这样注册事件处理程序:

          this.KeyDown += new KeyEventHandler(Form1_KeyDown);

然后像这样取消注册相同的处理程序:

          this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

对我来说这似乎很奇怪,因为我希望 -= 需要最初注册的相同处理程序,而不是相同签名的第二个新处理程序。但根据经验,我知道这是可行的。这使我认为这是一个特例,实际上

          Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)

基于这个理论,我经常重写我的代码来注册和注销这样的事件:

          this.KeyDown += Form1_KeyDown;

这安全吗?或者这会产生一些我没有意识到的意外副作用?

4

1 回答 1

4

相同,编译器知道它必须从事件类型创建 KeyEventHandler 委托的新实例。并自动为其生成代码。随意使用它,任何阅读您的代码的人都非常清楚。

甚至带有new运算符的语句也是语法糖,MulticastDelegate 构造函数接受两个参数,而不是像语句所暗示的那样,目标 ( this ) 和方法。编译器会自动找出目标。了解事件订阅添加对您的对象的引用很重要,它是泄漏的常见来源。

+= 运算符也是语法糖,它被转换为调用添加事件的访问器方法。类似地,-= 运算符被转换为对remove访问器的调用。很多管道是故意隐藏的。

最后但同样重要的是,你做错了。您应该改写表单的 OnKeyDown() 方法。一个类监听它自己的事件是没有意义的,它们是用于其他不相关的代码的。那有点倒霉。

于 2011-04-27T00:12:15.593 回答