13

オブジェクトをnullに設定すると、オブジェクトのイベントに関連付けられているすべてのイベントハンドラがクリーンアップされるかどうかと思いました...

gt;

Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

等...

これによりメモリリークが発生しますか?

3 답변


16

他に参照がない場合buttonどこでも、メモリリークを避けるためにイベントハンドラをここで削除する必要はありません。イベントハンドラは一方向の参照なので、イベントハンドラはイベントを含むオブジェクトが長命である場合にのみ必要です。ハンドラー(つまり、ハンドラメソッドを持つオブジェクト)は、本来よりも長く生きることができません。あなたの例では、これは事実ではありません。


  • これは、アプリケーションバーのイベントハンドラが明示的に削除する必要がないことを意味しますか(たとえば、statechanged)。 - Hans Petter Naumann
  • これは逆の状況です。 AppBarは長命のオブジェクトであり、イベントハンドラは少なくともAppBarが生きている限りデリゲートが参照しているオブジェクトを生き続けているので、それを起こしたくないかもしれません。一方、ハンドラがバーを所有するウィンドウ上のメソッドである場合、それは問題になりません。 - Pavel Minaev

11

概要:イベントのソース/発行者が長持ちし、購読者がそうでない場合は、明示的に購読を中止する必要があります。イベントソースが購読者よりも古くなった場合、登録解除されない限り(およびイベント発行者の通知リストから自分自身への参照を削除するまで)、登録されたすべての購読者はイベントソースによって「生存」されます。

またこれはの複製ですC#でイベントハンドラを明示的に削除する必要がありますかそして良いタイトルnの答えを持っています。だから投票を終了する。


  • そのQ&Aを見ました。私の質問はもっとずっと単純で、もっと簡単な答えが必要です。 - Damien

8

ディスカッションを見る「最後の質問:イベントハンドラを削除する必要がありますか」の下にあります。

結論:あなたは削除する必要があります   イベントが到着したときにイベントから代理   クラス自体の外側すなわちいつ   あなたは外部のイベントを購読しています、あなたは   あなたはあなたの購読を終了するべきです   完了です。そうしなくても維持されます   あなたのオブジェクトは   必要。

リンクされた質問


関連する質問

最近の質問