如何清除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可能无法清理处置的类。