首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理具有长期存在的依赖关系的对象

处理具有长期存在的依赖关系的对象
EN

Stack Overflow用户
提问于 2010-03-24 17:36:35
回答 2查看 317关注 0票数 0
代码语言:javascript
复制
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的实例挂在周围。

有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 18:17:21

这个问题的一个显而易见的解决方案是,在搁置这个问题一年之后,我应该实现IDisposable,并在我的Dispose()中简单地取消订阅事件。

由于我不对依赖项的生命周期负责,因此我也不能对它做任何事情。

票数 1
EN

Stack Overflow用户

发布于 2010-03-25 22:31:32

我在MSDN上读到这篇文章

因为Dispose方法必须显式调用,所以实现IDisposable 的对象还必须实现终结器,以便在Dispose不调用时处理资源释放。默认情况下,垃圾回收器在回收内存之前自动调用对象的终结器。但是,一旦调用了Dispose方法,垃圾回收器通常就没有必要调用已释放对象的终结器。若要防止自动终结,Dispose实现可以调用GC.SuppressFinalize方法。

所以为了安全起见,在这种情况下,我同时实现了IDisposable和终结器。我同意,这有点脏,但话又说回来,这是你在处理长寿命对象时付出的代价。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2506560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档