不注销事件处理程序是不好的?
如果我有一个只有less数事件处理程序注册的应用程序(并且在应用程序closures之前使用这些事件的对象不会被处理),我是否真的需要担心注销那些处理程序? 我能看到的唯一的理由是,如果事件被触发,你不需要关心(即你有多个处理程序注册到一个事件),可能会有一点额外的开销。 还有其他什么好的理由吗? 任何人遇到重大问题,因为他们没有取消注册事件?
如果你有A
发布一个事件,而B
订阅一个事件(处理器),那么只有A
不会比B
更长的时间才能退订。 基本上,事件订阅意味着A
仍然可以看到B
,所以会阻止它被垃圾收集,并且即使你忘记了它(也许Disposed()
它)仍然会在它上面发起事件。
例如,如果A
是一个静态事件,这是一个问题,你的应用程序在B
死后会运行一段时间。
值得注意的是,有人可能会问:
如果B比A长得多,B会不会把垃圾收集起来呢?
而答案是“不”。 B通过事件没有提及A; A将会正常收集
许多人似乎认为,如果发行商要超过订阅者,退订事件就非常重要。 我不喜欢这种方法。 事件订阅者不会从发布者中分离出来,这会对发布者和订阅者之外的实体的行为产生一些讨厌的依赖。 如果发布者的引用持续时间比预期的长,那么这将保持用户活着,以及用户持有引用的任何对象。 如果大量被抛弃的对象被事件处理程序相互关联,但是其中没有任何实时引用,则所有对象都可以被垃圾收集器清除。 但是,如果某个人意外地保留了某个对象的引用,那么可能会阻止任何对象被垃圾收集。
恕我直言,主动去除事件处理程序比放弃它更好,希望一切都得到清理。 除非可以确定没有意外的引用出版者可以存在,否则这种方法可能“主要”工作,但是偶尔会造成内存泄漏。