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方法。
我应该实施终结者并取消订阅吗?感觉很脏,但我不想挂ABC的实例。
思想?
答案 0 :(得分:1)
我在MSDN上看到了这个:
因为Dispose方法必须是 明确调用,对象 实现IDisposable 也必须 实现终结器来处理 当Dispose不是时释放资源 称为即可。默认情况下,垃圾 收集器自动调用 在回收之前对象的终结器 它的记忆。但是,一旦处理完毕 方法已被调用,它是 通常不需要垃圾 收集者打电话给处置 对象的终结者。阻止 自动完成,处理 实现可以调用 GC.SuppressFinalize方法。
因此,在这种情况下,为了安全起见,我将实现IDisposable和终结器。我同意,它有点脏,但话又说回来,那就是你在处理长寿命物品时付出的代价。
答案 1 :(得分:1)
在将这个问题单独留下一年之后,明显的解决办法就是我应该实现IDisposable并简单地取消订阅我的Dispose()中的事件。
由于我不负责依赖的生命周期,因此我不应该对它做任何事情。