1

これは、.NET からオブジェクトを適切に破棄することに関する別の質問です。dispose のベスト プラクティス (および人々の意見) に関する多くのさまざまな記事を読んだ後、私はその答えを得ることができませんでした。Form1 と Form2 の 2 つのフォームがあります。

フォーム1

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

フォーム2

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

Form2 で Close() を呼び出す場合、Form2 は is dispose() メソッドを呼び出す必要があります。これは is Show() メソッドを呼び出して開かれたためですが、Form1 が TextChanged イベントまたは Form2 に登録されているため、これにより Form2 が破棄または作成されなくなります。 GC による廃棄のプロセスは効率が悪いのですか?

前もって感謝します

4

1 に答える 1

1
Form2 フォーム = 新しい Form2();
form.TextChanged += 新しいイベントハンドラ (form_TextChanged);

これは、Form2 インスタンスが Form1 の form_TextChanged メソッドへの参照を持っていることを意味します。Form2 が閉じられている場合、これによって収集が妨げられることはないため、この場合、購読解除は必須ではありません。

Form2 が Form1 イベントをサブスクライブするとします。この場合、Form2 が閉じられると、Form1 には Form2 へのアクティブな参照がまだあり、Form2 を収集できないため、メモリ リークが発生します。

したがって、答えはサブスクリプションの方向とイベント ソース/サブスクライバーの有効期間によって異なります。いずれにせよ、不明な点がある場合は、イベントの登録を解除することをお勧めします。

于 2011-09-14T05:25:24.800 に答える