3

假设我们有以下模型:

    public class Bar<T>:List<T>
    {
        public delegate void CollectionChangedDelegate();
        public event CollectionChangedDelegate CollectionChanged;
    }

    public class Foo
    {
        Bar<object> MyCollection = new Bar<object>();

        public Foo()
        {
            MyCollection.CollectionChanged += new Bar<object>.CollectionChangedDelegate(MyCollection_CollectionChanged);
        }

        public void MyCollection_CollectionChanged()
        {
            //Do Something
        }

        ~Foo() //Would this work ?
        {
            MyCollection.CollectionChanged -= MyCollection_CollectionChanged;
        }
    }

Foo在这种情况下可以调用Class 的析构函数吗?

4

2 回答 2

3

首先,我相信您正在尝试编写 ObservableCollection
您可以在这里找到信息:http: //msdn.microsoft.com/en-us/library/ms668604.aspx

现在,如果我的对象包含需要处置的数据成员,我将实现 IDisposable 并在那里处置它们,或者至少删除事件订阅。
像这样实现它:

class Foo:Idisposable 
{
    public void Dispose(bool b)
    {
         MyCollection.CollectionChanged -= MyCollection_CollectionChanged;
    }
}
于 2013-08-21T11:32:10.677 回答
3

这样做是没有意义的。让我们假设有这样的订阅。现在,为了让我们得到~Foo方法,我们必须被收集,所以我们必须是不可到达的。由于事件的工作方式,订阅使我们可以访问(发布者具有对订阅者的引用) - 因此我们可以推断出这MyCollection也是不可访问的。如果不是,我们就不会被收集。

如果MyCollection不可达,则要么已经被收集,要么即将被收集。无需取消订阅。

删除~Foo:这里没有意义;实际上,它比毫无意义更糟糕- 除了没有任何用处之外,它还迫使垃圾收集器通过一个额外的步骤(终结器队列)推动这个对象。

但是,您可能想要添加某种确定性清理来执行此操作;正如 Joroen 指出IDisposable的那样,可能有用 - 但是,如果不了解更多上下文,很难说它是否适合这种情况。

于 2013-08-21T11:24:23.990 回答