2011-09-14 3 views
1

これは.NETからオブジェクトをうまく処理するためのもう1つの質問です。ベストプラクティス(そして人々の意見)を処分することについて、さまざまな謎を読んだ後、私はその答えを得ることができませんでした。 Form1とForm2という2つのフォームがあります。Form1がForm2を開き、Form2.TextChangedに登録する場合、Form2が終了している場合は、Form1内からForm2.TextChangedの登録を解除する必要がありますか?

をForm1

void ShowFormButton_Click(object sender, eventargs e) 
{ 
    Form2 form = new Form2(); 
    form.TextChanged += new eventhandler(form_TextChanged); 
    form.Show(this); 
} 

のForm2でのForm2

void CloseFormButton_Click(object sender, eventargs e) 
{ 
    Close(); 
} 

閉じる()を呼び出すと、Form2が持っている必要があり、それが呼び出すことによって開かれたためにdispose()メソッドの呼び出しで表示されます()メソッドを使用していますが、Form1がTextChangedイベントまたはForm2に登録されているため、Form2が処分されないようにするか、GCによる処理の効率が低下しますか?予め

おかげ

答えて

1
 
Form2 form = new Form2(); 
form.TextChanged += new eventhandler(form_TextChanged); 

これはForm2のインスタンスがForm1のform_TextChangedメソッドへの参照を有することを意味します。 Form2がクローズされても、これが収集されるのを妨げるものではないので、この場合、サブスクライブ解除は必須ではありません。

Form2がForm1イベントを購読しているとします。この場合、Form2が閉じられると、Form1はまだForm2へのアクティブな参照を持ち、Form2は収集されず、メモリリークが発生します。

したがって、回答はサブスクリプションの方向とイベントソース/サブスクライバの存続期間によって異なります。いずれにしても、何かが明確でない場合は、イベントの登録を解除することをお勧めします。

関連する問題