我关注的一件事是我发现了两种向代表注册事件的方式。
第一个是干净的,做“OnStuff - = this.Handle”是有道理的。从事件中取消注册......但是对于后一种情况,我应该做“OnStuff - = new StuffEventHandler(this.Handle);”?感觉就像我没有删除任何东西,因为我正在抛出另一个StuffEventHandler引用。事件是否通过引用比较委托?我担心我可以在这里开始讨厌的内存池。抓住我?我没有引用我之前注册过的“new StuffEventHandler”。
做#1的缺点是什么?
做#2有什么好处?
答案 0 :(得分:10)
第一个只是简写,它将生成与第二个相同的MSIL,在编译类型它将查看this.Handle并推断委托实例化。但是你永远不应该使用新的取消订阅。
因此,2,只是一些语法糖,使我们的代码更清洁。
答案 1 :(得分:6)
您不必担心保留对最初注册的委托的引用,并且您不会启动“讨厌的内存池”。
当你调用“OnStuff - = new StuffEventHandler(this.Handle);”时删除代码不比较您通过引用删除的委托:它通过比较对委托将调用的目标方法的引用来检查相等性,并从“OnStuff”中删除匹配的委托
顺便说一句,“OnStuff”本身就是一个委托对象(我假设你在声明中使用的事件关键字只限制了委托的可访问性)。
答案 2 :(得分:2)
我的印象是2只是语法糖。它们应该完全相同的东西。
答案 3 :(得分:1)
如果我没记错的话,第一种选择仅仅是第二种语法糖。