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