一个事件处理程序能否测试它的对象是否能够进行垃圾回收?

23 浏览
0 Comments

一个事件处理程序能否测试它的对象是否能够进行垃圾回收?

如果我有以下代码:

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的回收没有影响。 \n\n对于垃圾回收的一般情况(特别是目标):这取决于MyFunction是静态的还是基于实例的。 \n\n代表(例如事件订阅)实例方法的委托包括对实例的引用。因此,一个事件订阅将会防止垃圾回收。然而,一旦发布事件的对象(如上面的pClass)符合回收的条件,这将不再是一个问题。 \n\n请注意,这是单向的;即如果我们有:\n\n

publisher.SomeEvent += target.SomeHandler;

\n\n那么\"publisher\"将会保持\"target\"活着,但\"target\"不会保持\"publisher\"活着。\n\n因此,如果pClass无论如何都要被回收,没有必要取消订阅监听器。但是,如果pClass是长期存在的(比具有MyFunction的实例更长),那么pClass可能会使该实例保持活跃,因此如果想要回收目标,则需要取消订阅。\n\n然而,由于这个原因,静态事件在与基于实例的处理程序一起使用时非常危险。

0