事件处理程序会阻止垃圾收集吗?

37 浏览
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月22日
0
0 Comments

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

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

0
0 Comments

对于问题“pClass是否会被垃圾回收”: 事件订阅对于pClass(作为发布者)的收集没有影响。\n\n对于一般的GC(特别是目标): 这取决于MyFunction是静态的还是基于实例的。\n\n委托(如事件订阅)到一个实例方法包括对实例的引用。因此,是的,事件订阅将防止GC。但是,一旦发布事件的对象(pClass)可以进行收集,这就不再是一个问题了。\n\n注意这是单向的; 即如果我们有:\n\n

publisher.SomeEvent += target.SomeHandler;

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

0