2009-08-27 33 views
10

VSのDesignerから、ボタンをダブルクリックして、このClickイベントハンドラを生成します。すべてのイベントハンドラを登録解除する必要がありますか?

購読コードはdesigner.csにあります。

私は、そのフォームを廃棄する際に、イベントを退会しなければなりませんか?

また、フォームにあるすべてのコントロールは、フォームの廃棄時に処分されますか?それは実際に各コントロールで再帰的に処理を呼び出しますか?

答えて

15

あなた自身のイベントをフックする場合、Disposeでイベントをアンフックする必要はありません。

イベントを別のオブジェクトにフックする場合は、心配する必要があります。この理由は、イベントフックが参照をサブスクライバに保持しているためです。あなたがフックを外していない場合、観測値がまだ生きている限り、ガベージコレクションは行われません。

あなた自身のイベントをフックすると、自分自身への参照があります。これは循環的なものなので、心配する必要はありません。

私は、この理由から、より疎結合のイベントパターンをサポートするようになりました。これは.Netのメモリリークの#1の場所です。私はEvent Aggregatorパターン(weak events)を好む。イベントハンドラのコード限り

+0

大変ありがとうございます。あなたが自分自身に夢中になっているときには外れないように完璧に理にかなっています。 – pdiddy

1

はフォーム自体である、あなたは、イベントを解除する必要はありません - フォーム自体が破壊されるようにコントロールにダングリングイベントハンドラは存在しないだろうと

2

「実際には各コントロールで再帰的に処分を呼びますか?」という質問に対して、答えは「はい」です。

簡単なテストは、コントロールのDisposeメソッドにブレークポイントを設定することで実行できます。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Controls.Add(new SuperButton()); 
    } 
} 

public class SuperButton : Button 
{ 
    protected override void Dispose(bool disposing) 
    { 
     //Place breakpoint on the line below 
     base.Dispose(disposing); 
    } 
} 
関連する問題