6

我关心的一件事是我发现了两种注册事件代表的方法。

  1. OnStuff += this.Handle;
  2. OnStuff += new StuffEventHandler(this.Handle);

第一个是干净的,执行“OnStuff -= this.Handle;”是有意义的 从事件中注销...但是对于后一种情况,我应该执行“OnStuff -= new StuffEventHandler(this.Handle);”吗?感觉就像我根本没有删除任何东西,因为我正在抛出另一个 StuffEventHandler 参考。事件是否通过引用比较委托?我担心我会在这里启动一个令人讨厌的内存池。找我?我没有对我之前注册的“新 StuffEventHandler”的引用。

做#1的缺点是什么?

做#2有什么好处?

4

4 回答 4

10

第一个只是简写,它将生成与第二个相同的 MSIL,在编译类型时它会查看 this.Handle 并推断要实例化的委托。但是你永远不应该使用 new 来取消订阅。

所以两者之间没有区别,只是一些语法糖让我们的代码更干净。

于 2008-09-19T05:11:55.643 回答
6

您无需担心保留对最初注册的委托的引用,也不会启动“讨厌的内存池”。

当您调用“OnStuff -= new StuffEventHandler(this.Handle);”时 删除代码不会比较您通过引用删除的委托:它通过比较对委托将调用的目标方法的引用来检查是否相等,并从“OnStuff”中删除匹配的委托。

顺便说一句,“OnStuff”本身是一个委托对象(我假设您在声明中的 event 关键字只是限制了委托的可访问性)。

于 2008-09-19T09:26:25.877 回答
2

我的印象是 2 只是语法糖。它们应该是完全相同的东西。

于 2008-09-19T05:11:43.693 回答
1

如果我没记错的话,第一种选择只是第二种的语法糖。

于 2008-09-19T05:13:39.103 回答