- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
这可能是一个非常简单的问题,但我完全迷失了方向,并且寻找答案并没有帮助。 我有一些 powershell 代码来显示带有文本框的简单 GUI。某些文本框允许用户按 Enter 键来运行 Button_
在 Windows 窗体应用程序中,您可以像这样注册事件处理程序: this.KeyDown += new KeyEventHandler(Form1_KeyDown); 然后像这
我是一名优秀的程序员,十分优秀!