这段代码会导致内存泄漏吗?
这段代码会导致内存泄漏吗?
如果我有以下代码:
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(作为发布者)的收集没有影响。\n对于一般的GC(特别是目标),这取决于MyFunction是静态的还是基于实例的。\n一个委托(例如事件订阅)到一个实例方法包括对实例的引用。是的,事件订阅将阻止GC。然而,一旦发布事件的对象(上面的pClass)有资格进行收集,这就不再是问题了。\n请注意,这是单向的; 也就是说,如果我们有:\n
publisher.SomeEvent += target.SomeHandler;
\n然后“发布者”将使“目标”保持活动状态,但“目标”不会使“发布者”保持活动状态。\n所以,如果pClass无论如何都要被收集,那么无需取消订阅侦听器。但是,如果pClass的生命周期很长(比MyFunction实例更长),那么pClass可能会使该实例保持活动状态,因此如果要收集目标,则需要取消订阅。\n然而,由于这个原因,静态事件与基于实例的处理程序一起使用非常危险。