事件处理程序会阻止垃圾收集吗?
事件处理程序会阻止垃圾收集吗?
如果我有以下代码:
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日
对于问题“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然而,基于这个原因,静态事件在与基于实例的处理程序一起使用时非常危险。