代码之家  ›  专栏  ›  技术社区  ›  Ray Booysen

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

  •  0
  • Ray Booysen  · 技术社区  · 14 年前
    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的例子。

    思想?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Prutswonder    14 年前

    我在读这个 MSDN :

    因为dispose方法必须是 显式调用,对象 实现IDisposable 还必须 实现要处理的终结器 当dispose不是 打电话 . 默认情况下,垃圾 收集器自动调用 回收前对象的终结器 它的记忆。然而,一旦处置 方法已被调用,它是 对于垃圾来说通常是不必要的 收集器调用已释放的 对象的终结器。预防 自动定稿、处理 实现可以调用 抑制定型法。

    为了安全起见,我实现了idisposable和finalizer。我同意,这有点脏,但再说一遍,这是你在处理长寿命物体时付出的代价。

        2
  •  1
  •   Ray Booysen    13 年前

    解决这个问题的明显方法是,在将这个问题单独处理一年之后,我应该实现idisposable并在dispose()中取消订阅事件。

    既然我对依赖的一生不负责任,那就不由我来处理了。