不注销事件处理程序是不好的?

如果我有一个只有less数事件处理程序注册的应用程序(并且在应用程序closures之前使用这些事件的对象不会被处理),我是否真的需要担心注销那些处理程序? 我能看到的唯一的理由是,如果事件被触发,你不需要关心(即你有多个处理程序注册到一个事件),可能会有一点额外的开销。 还有其他什么好的理由吗? 任何人遇到重大问题,因为他们没有取消注册事件?

如果你有A发布一个事件,而B订阅一个事件(处理器),那么只有A不会比B更长的时间才能退订。 基本上,事件订阅意味着A仍然可以看到B ,所以会阻止它被垃圾收集,并且即使你忘记了它(也许Disposed()它)仍然会在它上面发起事件。

例如,如果A是一个静态事件,这是一个问题,你的应用程序在B死后会运行一段时间。

值得注意的是,有人可能会问:

如果B比A长得多,B会不会把垃圾收集起来呢?

而答案是“不”。 B通过事件没有提及A; A将会正常收集

许多人似乎认为,如果发行商要超过订阅者,退订事件就非常重要。 我不喜欢这种方法。 事件订阅者不会从发布者中分离出来,这会对发布者和订阅者之外的实体的行为产生一些讨厌的依赖。 如果发布者的引用持续时间比预期的长,那么这将保持用户活着,以及用户持有引用的任何对象。 如果大量被抛弃的对象被事件处理程序相互关联,但是其中没有任何实时引用,则所有对象都可以被垃圾收集器清除。 但是,如果某个人意外地保留了某个对象的引用,那么可能会阻止任何对象被垃圾收集。

恕我直言,主动去除事件处理程序比放弃它更好,希望一切都得到清理。 除非可以确定没有意外的引用出版者可以存在,否则这种方法可能“主要”工作,但是偶尔会造成内存泄漏。