从局部变量中删除事件侦听器

时间:2012-09-03 18:43:27

标签: c# events event-handling event-listener

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

考虑以下示例:

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

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

2 个答案:

答案 0 :(得分:4)

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

向事件添加事件处理程序时,会创建从(包含)事件的对象到事件处理程序的引用,而不是相反的方法。一旦zipUtil超出范围,事件处理程序就不会对zipUtil的引用产生任何影响。

答案 1 :(得分:2)

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

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

  • 由于事件,您可能会遇到垃圾回收问题。事件委托保留对类对象的隐式引用,这是必需的,因此它可以调用ZipUtil_ProgressChanged()方法。如果是实例方法,则不能从您的代码段中清除。该引用将使您的外部阶级保持活力。但不是相反。鉴于ZipUtil对象的生命周期仅限于该方法,并且您肯定希望您的外部类至少存活到方法的末尾,这应该永远不会成为问题。

ZipUtil实现IDisposable btw的高赔率。如果确实如此,请确保使用使用语句。