0

我是否必须担心删除分配给局部变量的事件侦听器?

考虑以下示例:

var zipUtil = new ZipUtil();
zipUtil.ProgressChanged += ZipUtil_ProgressChanged;

我正在创建一个ZipUtil类的实例,该实例存储为方法中的局部变量。我是否必须zipUtil.ProgressChanged -= ZipUtil_ProgressChanged;在方法终止之前删除侦听器 ( ) 还是可以跳过该步骤?

4

2 回答 2

5

不,您不必删除该事件处理方法。

将事件处理程序添加到事件时,会创建从(包含该事件的对象)事件到事件处理程序的引用,而不是相反。一旦zipUtil超出范围,事件处理程序将不会对zipUtil.

于 2012-09-03T18:46:46.803 回答
2

两行代码永远不足以准确地进行调用。但是您不太可能需要明确取消订阅。有两种可能的问题场景:

  • 例如,在您的对象被释放后,该类可能会在不合时宜的时间触发其事件。在这种情况下,这不太可能发生,当您停止调用其方法时,ZipUtil 类肯定会停止引发 ProgressChanged 事件。并非完全不可能,例如,它可以在后台线程上工作。从您的代码段中看不到。

  • 由于事件,您可能会遇到垃圾收集问题。事件委托保留对您的类对象的隐式引用,这是必要的,因此它可以调用 ZipUtil_ProgressChanged() 方法。如果它是实例方法,则从您的代码段中不清楚。该参考将使您的外部班级保持活力。但不是反过来。鉴于 ZipUtil 对象的生命周期仅限于方法,并且您肯定希望外部类至少能存活到方法结束,这绝不是问题。

ZipUtil 实现 IDisposable btw 的可能性很高。如果确实如此,请确保使用using语句。

于 2012-09-03T18:55:18.200 回答