C#文件监视器监视配置文件
C#文件监视器监视配置文件
如果我有以下代码:
MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass = null;
pClass会被垃圾回收吗?还是它会一直存在并在事件发生时继续触发它们?我需要这样做才能允许垃圾回收吗?
MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass.MyEvent -= MyFunction; pClass = null;
admin 更改状态以发布 2023年5月23日
针对具体问题“pClass 是否会被垃圾回收”,事件订阅对 pClass(作为发布者)的收集没有影响。
对于一般公共的 GC(特别是目标的情况),这取决于 MyFunction 是否是静态或者基于实例的。
对实例方法(如事件订阅)的委托包含对实例的引用。因此,是的,事件订阅将防止 GC。但是,一旦发布事件的对象(如上述的 pClass)可以被收集,这就不再是问题。
请注意,这是单向的;也就是说,如果我们有:
publisher.SomeEvent += target.SomeHandler;
那么“发布者”将使“目标”保持活跃,但是“目标”将不会使“发布者”保持活跃。
因此,如果 pClass 将被收集,那么无需取消订阅侦听器。但是,如果 pClass 寿命较长(比具有 MyFunction 的实例长),那么 pClass 可以使该实例保持活动状态,因此如果您想使目标被收集,则有必要取消订阅。
然而,基于这个原因,静态事件与基于实例的处理程序一起使用时非常危险。