2012-04-13 22 views
0

私は、別の一連のカスタムコントロール(CustomButtons)を含むカスタムコントロールCustomContainerを持っています。イベントハンドラを持つユーザーコントロールのDisposeを実装する必要がありますか?

コントロールのCustomContainerには5つのカスタムボタンがあります。

各CustomButtonsには、CustomContainerのコンストラクターに組み込まれたClickイベントハンドラーがあります。

これらのCustomButtonsイベントハンドラの配線を解除するには、Control CustomContainerのDisposeをDisposeする必要があります(UserControlから継承したDisposeがあります)。 Disposingで十分ですか、ここでメモリリークがありますか?

おかげで、 A.

+1

[Mark](http://stackoverflow.com/a/298276/95573)は、この質問によく答えています。 – SwDevMan81

+0

@ SwDevMan81その質問は私よりはるかに優れています:) – AidanO

答えて

1

ほとんどの制御イベントを伴うケースでは、イベントパブリッシャとサブスクライバがほぼ同時に同じスコープから外れるため、イベントを処理せずに放棄して問題にならないようにすることができます。いくつかの点では、イベントのクリーンアップが正しさが必要であると判断された場合、おそらく言語サポートがあり、まともなコードでイベントをクリーンアップするので、これは残念です。

問題は、放棄されたイベントのパブリッシャがガベージコレクションされないようにすることで、そのサブスクライバがガベージコレクションされないようにすることです。それらの加入者が自分のイベントを公開している場合、すべての加入者も同様にガーベジコレクションなどから不必要に保護されます。例えば、美しく動作するプログラムがあるとしますが、別のフォームが開いたり閉じたりすると、各フォームは他の開いたフォームをリストした「Windows」メニューを持つことができます。ニースの特徴。しかし、そのような通知を提供するイベントから退会することなくフォームが配備された場合、そのような不具合により、フォーム、そのコントロール、またはそれらが参照するその他のオブジェクトが常に収集されることを妨げる可能性があります。プログラムの存続期間中に複数のドキュメントを開いたり閉じたりした場合に問題が発生する可能性がありますが、エンドユーザー以外では検出されない可能性がありますが、大きなメモリリークが発生します。

イベントのクリーンアップを処理するには、フォームのDisposedイベントを使用することをお勧めします。デザイナーによって生成されたDisposeコードを変更する可能性があります。デザイナーはおそらくこれらの変更をそのまま残していますが、Disposedイベントが存在する場合、デザイナーが生成するファイルを変更することは避けてください。

1

いいえ、あなたはIDisposableを実装し、あなたが持っているイベントハンドラから非サブスクリプションのDispose()だけを実装する必要はありません。あなたが持っているイベントハンドラ(ポストによると、ボタンのクリック)の存在はメモリリークを引き起こしません。

0

IDisposableは、アンマネージドリソースをクリーンアップするために使用されます。すべての管理対象リソースは、ガベージコレクタによってクリーンアップされます。オブジェクトへの参照がなくなると、次にGCを実行すると、アプリケーションからアクセスできないすべてのものが解放されます。

関連する問題