我是否必须担心删除分配给局部变量的事件侦听器?
考虑以下示例:
var zipUtil = new ZipUtil();
zipUtil.ProgressChanged += ZipUtil_ProgressChanged;
我正在创建一个ZipUtil
类的实例,它在方法中存储为局部变量。在方法终止之前是否必须删除侦听器(zipUtil.ProgressChanged -= ZipUtil_ProgressChanged;
)或者是否可以跳过该步骤?
答案 0 :(得分:4)
不,您不必删除该事件处理方法。
向事件添加事件处理程序时,会创建从(包含)事件的对象到事件处理程序的引用,而不是相反的方法。一旦zipUtil
超出范围,事件处理程序就不会对zipUtil
的引用产生任何影响。
答案 1 :(得分:2)
两行代码永远不足以准确地进行通话。但是你不太可能需要明确取消订阅。有两种可能的问题场景:
例如,在您的对象被处理之后,该类可能会在不合适的时间触发其事件。在这种情况下,这是不太可能的,当您停止调用其方法时,ZipUtil类肯定会停止引发ProgressChanged事件。不完全完全,它可以在后台线程上工作,例如。从您的代码段中看不到。
由于事件,您可能会遇到垃圾回收问题。事件委托保留对类对象的隐式引用,这是必需的,因此它可以调用ZipUtil_ProgressChanged()方法。如果是实例方法,则不能从您的代码段中清除。该引用将使您的外部阶级保持活力。但不是相反。鉴于ZipUtil对象的生命周期仅限于该方法,并且您肯定希望您的外部类至少存活到方法的末尾,这应该永远不会成为问题。
ZipUtil实现IDisposable btw的高赔率。如果确实如此,请确保使用使用语句。