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

そうするのは無意味です。そのようなサブスクリプションがあると仮定しましょう。さて、~Fooメソッドにたどり着くには、収集されている必要があるため、到達できない必要があります。イベントがどのように機能するかにより、サブスクリプション到達可能になります (パブリッシャーはサブスクライバーへの参照を持っています) 。そうでなければ、私たちは集められませんでした。MyCollection

に到達できない場合MyCollectionは、既に収集されているか、収集されようとしています。退会する必要はありません。

削除~Foo: ここでは無意味です。実際には、これは無意味というよりも悪いことです。役に立たないことに加えて、ガベージ コレクターがこのオブジェクトを追加のステップ (ファイナライザー キュー) にプッシュするように強制します。

ただし、これを行う何らかの決定論的なクリーンアップを追加したい場合があります。Joroen が指摘しているように、役に立つIDisposableかもしれませんが、より多くの文脈を知らずに、その場合に適切かどうかを判断するのは困難です。

于 2013-08-21T11:24:23.990 に答える