13

.ShowDialog()メソッドでフォームを開いたとします。

ある時点で、フォーム上のいくつかのコントロールにいくつかのイベントハンドラを添付します。

gt;

// Attach radio button event handlers.
this.rbLevel1.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel2.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel3.Click += new EventHandler(this.RadioButton_CheckedChanged);

フォームが閉じたら、これらのハンドラを削除する必要がありますね。

現在、FormClosingイベントが発生したときにこれを行っています。

gt;

private void Foo_FormClosing(object sender, FormClosingEventArgs e)
{
    // Detach radio button event handlers.
    this.rbLevel1.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel2.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel3.Click -= new EventHandler(this.RadioButton_CheckedChanged);
}

ただし、Dispose()メソッドでハンドラが削除された例がいくつかあります。

これを行うための「ベストプラクティス」の方法はありますか?

(C#を使用、Winforms、.NET 2.0)

ありがとう。


  • なぜあなたはこれを自分でやりたいのですか? GCがあなたのためにこれをするでしょう。 - Fabian
  • @Fabian:その答えをすでに知っているのであれば、質問を投稿していないでしょう。 :) - Andy

2 답변


18

この場合、フォームもそのボタンもフォームの外部のコードによって参照されず、したがってオブジェクトグラフ全体がガベージコレクションされるため、ハンドラを削除する必要はありません。


  • そう、フォームは破棄されているので、フォーム上のすべてのコントロールも配置されています。イベントハンドラへのリンクはありません。私が何かを作ったら、私もそれの後で片付けるべきだといつも思っていました。 - Andy
  • その通りです。そのメソッドの1つが他のオブジェクトのイベントのターゲットとなっているオブジェクトのコレクションが必要な場合は、ハンドラを削除する必要があります。ただしこの場合、オブジェクト(フォーム+ボタン)は互いに参照するだけです。 - Ben M
  • ありがとうベン、理解した。 - Andy

3

いいえ、閉じているフォームのコントロールからイベントハンドラを削除する必要はありません。それらはすべて一緒に配置されます。

あなたはおそらくブラウザのメモリリークを避けるためにイベントハンドラを削除する必要があるウェブページを考えています。


  • サーバー側のイベントハンドラがブラウザのメモリリークを引き起こす? - Chris Taylor
  • いいえ、ブラウザ側のイベントハンドラはブラウザのメモリリークを引き起こします。古いブラウザでは、ページ読み込みイベントなどをフックしたままにしておくと、URLが別のページに変更されても、ページ読み込みイベントは古いページにフックされたままになります。したがって、メモリリークが発生します。 - dthorpe

関連する質問

最近の質問