如何清除C#中的事件订阅?

时间:2020-03-06 14:55:44  来源:igfitidea点击:

请使用以下Cclass:

c1 {
 event EventHandler someEvent;
}

如果有很多对c1的someEvent事件的订阅,而我想全部清除,那么实现此目的的最佳方法是什么?还请注意,此事件的订阅可能是lambdas /匿名代表。

目前,我的解决方案是在c1中添加一个ResetSubscriptions()方法,该方法将someEvent设置为null。我不知道这是否会带来任何看不见的后果。

解决方案

向c1添加一个将'someEvent'设置为null的方法...

class c1
{
    event EventHandler someEvent;
    ResetSubscriptions() {someEvent = null;}
}

我们可以通过使用Delegate.Remove或者Delegate.RemoveAll方法来实现。

在类中,我们可以将(隐藏)变量设置为null。空引用是有效表示空调用列表的规范方法。

从类之外,我们不能执行此事件,基本上就暴露了"订阅"和"取消订阅",仅此而已。

值得一提的是,类似字段的事件实际上在做什么,它们同时在创建变量和事件。在该类中,我们最终将引用该变量。我们可以从外部引用事件。

有关更多信息,请参见我有关事件和委托的文章。

在类内部将事件设置为null即可。处置类时,应始终将事件设置为null,GC会遇到事件问题,并且如果存在悬挂事件,GC可能无法清理处置的类。