使用关键字 new 将委托添加到事件中是不是安全?

Posted

技术标签:

【中文标题】使用关键字 new 将委托添加到事件中是不是安全?【英文标题】:Is it safe to add delegates to events with keyword new?使用关键字 new 将委托添加到事件中是否安全? 【发布时间】:2008-09-19 05:06:30 【问题描述】:

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

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

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

做#1的缺点是什么?

做#2有什么好处?

【问题讨论】:

相关讨论在:***.com/questions/1341895/c-event-removal-syntax 和 ***.com/questions/1178725/how-to-unset-event 【参考方案1】:

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

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

【讨论】:

同意+1,第一种方式曾经是.Net v1和1.1中做事的方式,在v2中添加了语法糖。 实际上,如果你能解释一下为什么我不应该通过 new 取消注册...它的工作原理是一样的。如果您说我不应该使用新关键字取消注册,请附上对某些文章的引用 你说得对,其实没什么区别,我以为会有的。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

我的印象是 2 只是语法糖。它们应该完全是一回事。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于使用关键字 new 将委托添加到事件中是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

C#规范整理·泛型委托事件

C#规范整理·泛型委托事件

c#—事件

如何在 C# 中使用 委托

委托和事件

C#委托(delegateActionFuncpredicate)和事件