[英]What happens with event handlers when an object goes out of scope?
假设我们有以下设置:
public class ClassA
{
public event EventHandler SomeEvent;
}
public class ClassB : IDisposable
{
public void SomeMethod(ClassA value)
{
value.SomeEvent += (s, e) => { DoSomething(); };
}
void DoSomething() { }
void Dispose() { }
}
public static class Program
{
static void Main()
{
var a = new ClassA();
using (var b = new ClassB())
b.SomeMethod(a);
// POINT OF QUESTION!!
}
}
在“问题点”之后引发事件SomeEvent
会发生什么?
它将调用已处理的 object 的方法。 这就是为什么取消订阅很重要。 它甚至会导致 memory 泄漏。
您应该使用 ClassB 的Dispose()
方法取消订阅 ClassA 事件。 您冒着类没有被垃圾收集的风险,这当然会导致潜在的 memory 泄漏。 您应该始终取消订阅事件。
你上面没有任何东西可以解开你的事件处理程序。 由于a
和b
go 同时从 scope 出来,你会很安全。 既然a
和b
都可以被收集,那么a
不会让b
活着。
如果您要在 using 语句之后引发ClassA.SomeEvent
事件,那么即使b
已被释放,也会调用ClassB.DoSomething
。 在这种情况下,您必须显式删除事件处理程序。
如果您要在其他地方保留对a
的引用,那么b
将由a
保持活动状态。 同样,因为事件处理程序尚未被删除。
没有什么。 运行时不知道Dispose
方法,并且在 using 语句中调用此方法对 memory 管理没有任何作用。
垃圾收集是关于 memory 管理的,但IDisposable
(和Finalizer
)是关于资源管理的,所以你仍然应该考虑自己并手动实现它(并且适当地,例如在Dispose
中取消订阅)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.