使用关键字new将委托添加到事件是否安全?
时间:2020-03-06 14:24:47 来源:igfitidea点击:
我关心的一件事是,我发现了两种注册事件代表的方法。
- OnStuff + = this.Handle;
- OnStuff + =新的StuffEventHandler(this.Handle);
第一个是干净的,执行" OnStuff-= this.Handle;"很有意义。取消注册该事件...但是在后一种情况下,我应该执行" OnStuff-= new StuffEventHandler(this.Handle);"吗?感觉好像我根本没有删除任何东西,因为我抛出了另一个StuffEventHandler参考。活动是否通过引用比较了委托人?我担心我可以在这里启动一个讨厌的内存池。救我我没有以前注册的"新StuffEventHandler"的引用。
做#1的缺点是什么?
做#2有什么好处?
解决方案
我的印象是2只是语法糖。他们应该是完全一样的东西。
第一个只是速记,它将生成与第二个相同的MSIL,在编译类型时将对此进行处理。但是,我们绝不应使用new取消订阅。
因此,两者之间没有区别,只是一些语法糖可以使我们的代码更简洁。
如果我没记错的话,第一种选择只是第二种语法糖。
我们不必担心保留对最初注册的委托的引用,并且不会启动"讨厌的内存池"。
当我们调用" OnStuff-= new StuffEventHandler(this.Handle);"时删除代码不会比较我们要通过引用删除的委托:它通过比较对委托将调用的目标方法的引用来检查是否相等,并从" OnStuff"中删除匹配的委托。
顺便说一句," OnStuff"本身就是一个委托对象(我假设我们在声明中使用的event关键字只是限制了委托的可访问性)。