gpt4 book ai didi

c# - new KeyEventHandler(Form1_KeyDown) 和 Form1_KeyDown 的区别

转载 作者:行者123 更新时间:2023-11-30 21:15:18 25 4
gpt4 key购买 nike

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

          this.KeyDown += new KeyEventHandler(Form1_KeyDown);

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

          this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

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

          Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)

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

          this.KeyDown += Form1_KeyDown;

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

最佳答案

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

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

+= 运算符也是语法糖,它被翻译成调用事件的add 访问器方法。同样,-= 运算符被转换为对 remove 访问器的调用。有意隐藏的大量管道。

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

关于c# - new KeyEventHandler(Form1_KeyDown) 和 Form1_KeyDown 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5797826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com