2009-08-17 6 views
22

私はC#Classesとそのdeconstructorについて少し混乱しています。EventHandlersとC#クラスdestructor/Dispose

私はコンストラクタで取得していたクラスのインスタンスでは、いくつかのイベントハンドラを消費する必要があります。

public Foo(IFooHandler handler) 
{ 
    handler.Load += Load; 
    handler.Close += Close; 
} 

私はFooのクラスが破棄されると、そのイベントに解除する必要があります。私はIDisposableを実装していますか?私はそれらのイベントを消費する必要があります、私は別の方法でそれを行うことはできません。

いずれかのクラスでは、インスタンスを作成し、進捗状況を確認してから、クラスインスタンスが範囲外になります。別のフォームの場合は、フォームが閉じられるまでMainFormに残ります。最初は、それがまだそのイベントハンドラへの参照を持っている可能性があり、正しく行かないことがあるため、私が心配していることです。

私はメモリをリークしたくありません。いつどのように退会する必要がありますか?

答えて

24

イベントハンドラがアタッチされている間は呼び出されないので、デストラクタでは実行しないでください.FooのインスタンスメソッドをBarイベントのハンドラとしてアタッチすると、BarはFooなので、Fooはガベージコレクションされず、そのデストラクタは呼び出されません。

あなたがIDisposableインターを実装し、あなたのオブジェクトを配置する必要があり、明示的に

public void Dispose() 
{ 
    if (handler != null) 
    { 
     handler.Load -= Load; 
     handler.Close -= Close; 
    } 
} 
+2

Ah!アンマネージドコードを整理しない限り、私はIDisposableを実装すべきではないと思いましたか? –

+0

IDisposableは他の理由で実装することができますが、管理されていないリソースのクリーニングに限定されるものではありません。 –

+1

一般的な使い捨てパターンを見ると、管理対象リソースと管理対象外リソースを処理するパスがあります。ほとんどの場合、管理されていないリソースや管理対象のリソースしかありません。しかし、あなたのケースでは、きれいにすべき管理されたリソースを持つだけで大丈夫です。 – Oliver

3

あなたはクラスAがイベントをサブスクライブ長く住んでいたクラスとクラス(ES)B短命するものでもあるの問題に直面した場合クラスAの場合、おそらくWeak Event Patternに興味があります。つまり、遅くなるまで見つからないという問題があります。つまり、Princeton self driving car.

関連する問題