2011-07-07 7 views
4

私はイベントからの退会が必要であることを知っています。 私の質問は、生成されたコードから来ている:このイベントハンドリングを作成するとき、VSはこのコードを追加しますC#UIイベントのサブスクリプションが必要ですか?

:あなたはVSエディタからUIを変更すると 、およびUI要素( private void BtnSampleClick(object sender, EventArgs e) EX)にイベントハンドラを追加しますprivate void InitializeComponent()自動生成されたコード

this.btnSample.Click += new System.EventHandler(this.BtnSampleClick); 

問題はVSは、フォームのDisposeメソッドで自動的に退会(this.btnSample.Click -= new System.EventHandler(this.BtnSampleClick);)を追加しないことです。

通常、右に追加する必要がありますか?そうでない場合、メモリリークに漏れますか? VSが自動的に登録解除を実行しない理由があるかどうかを確認したい。私たちがそれをしなくてもフォームは正しく処分されているのでしょうか?

私はこの問題でいくつかの光を細断するのを手伝ってくれてありがとう!

答えて

6

を作業するときにメモリが不足しないように、いくつかのケースでは、あなたが意図的に廃棄()メソッドを呼び出して、機能を配置呼び出す必要がない、または決して意味するものではありません

これは行われません。主に、この場合はが必要ありません。です。その理由は、フォームが、フォームによって管理されている存続期間を持つオブジェクトのイベントにサブスクライブしているためです。オブジェクト(つまり、ボタン)がGCの観点からルーティングされていない場合、フォームもルーティングされず(閉じられます)、メモリリークの可能性はありません。 .NETのGCはこのようなスマートな循環参照は問題ではありません。

イベントへの登録を解除することは、まだ一般的に行われています。サブスクリプションを作成しているオブジェクトとは独立した存続期間を持つオブジェクトのイベントにサブスクライブすると、それが重要になります。これは、イベントのあるオブジェクトがサブスクライバよりも長く存続する場合に特に当てはまります。このケースは、イベントによって引き起こされるメモリリークが発生しやすい場所です。たとえば、フォームが静的インスタンスのイベントにサブスクライブしていて、サブスクリプションを忘れた場合、フォームのガベージコレクションは決して行われません。その理由は、デリゲート参照がイベントサブスクリプションを介して "ルート"を維持するからです。

+0

+1同期ライフサイクルのために説明します。 – Ergwun

1

はい、明示的に登録を解除することをお勧めします。メモリリークを引き起こす可能性はありますが、管理されていないオブジェクトへの参照が保持されていない限り、GCは管理対象の世界でも正しく決定およびクリーンアップできます。

0

あなたはそれを気にする必要はありません。 Dot.NETフレームワークには、独自の原則を使用して自動的に処理するガベージコレクタ(GC)があります(オブジェクトが残っていない場合もあります)。私たちはネイティブDLL/Marshalクラスで

関連する問題