C#文件监视器监视配置文件

18 浏览
0 Comments

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日
0
0 Comments

是的, pClass 将被垃圾回收。事件订阅并不意味着存在任何对 pClass 的引用。

因此, 为了使 pClass 被垃圾回收, 您不需要分离处理程序。

0
0 Comments

针对具体问题“pClass 是否会被垃圾回收”,事件订阅对 pClass(作为发布者)的收集没有影响。

对于一般公共的 GC(特别是目标的情况),这取决于 MyFunction 是否是静态或者基于实例的。

对实例方法(如事件订阅)的委托包含对实例的引用。因此,是的,事件订阅将防止 GC。但是,一旦发布事件的对象(如上述的 pClass)可以被收集,这就不再是问题。

请注意,这是单向的;也就是说,如果我们有:

publisher.SomeEvent += target.SomeHandler;

那么“发布者”将使“目标”保持活跃,但是“目标”将不会使“发布者”保持活跃。

因此,如果 pClass 将被收集,那么无需取消订阅侦听器。但是,如果 pClass 寿命较长(比具有 MyFunction 的实例长),那么 pClass 可以使该实例保持活动状态,因此如果您想使目标被收集,则有必要取消订阅。

然而,基于这个原因,静态事件与基于实例的处理程序一起使用时非常危险。

0