public class ABC
{
public ABC(IEventableInstance dependency)
{
dependency.ANewEvent += MyEventHandler;
}
private void MyEventHandler(object sender, EventArgs e)
{
//Do Stuff
}
}假设ABC的一个实例是一个长期存在的对象,而我的依赖项是一个运行时间更长的对象。当需要清理ABC实例时,我有两个选择。
首先,我可以使用Cleanup()方法来取消订阅ANewEvent事件,或者我可以实现IDisposable并在Dispose中取消连接该事件。现在,我无法控制使用者是否会调用dispose方法,甚至是Cleanup方法。
我应该实现一个Finaliser然后取消订阅吗?感觉很脏,但我不想把ABC的实例挂在周围。
有什么想法?
发布于 2011-02-16 18:17:21
这个问题的一个显而易见的解决方案是,在搁置这个问题一年之后,我应该实现IDisposable,并在我的Dispose()中简单地取消订阅事件。
由于我不对依赖项的生命周期负责,因此我也不能对它做任何事情。
发布于 2010-03-25 22:31:32
我在MSDN上读到这篇文章
因为Dispose方法必须显式调用,所以实现IDisposable 的对象还必须实现终结器,以便在Dispose不调用时处理资源释放。默认情况下,垃圾回收器在回收内存之前自动调用对象的终结器。但是,一旦调用了Dispose方法,垃圾回收器通常就没有必要调用已释放对象的终结器。若要防止自动终结,Dispose实现可以调用GC.SuppressFinalize方法。
所以为了安全起见,在这种情况下,我同时实现了IDisposable和终结器。我同意,这有点脏,但话又说回来,这是你在处理长寿命对象时付出的代价。
https://stackoverflow.com/questions/2506560
复制相似问题