0

今日の .NET に非常に詳しいと思われる上司と話をしていると、デザイナーでコントロールへのイベントの割り当てを削除することを習慣化するように言われました。

彼の正確な説明は覚えていませんが、イベントが同じスレッド内に含まれておらず、実際にはガベージコレクションによって完全にクリーンアップされていないという行に沿った何かを覚えていますか? 電話での話し合いでしたが、ヘッドセットの調子が悪く、彼の声がよく聞こえず、彼の言ったことを正確に思い出すことができませんでした

誰かが詳しく説明してくれること、またはそれについてさらに読むための方向性を教えてくれることを望んでいましたか?

ありがとう!

価値があるのは、.NET 3.5 を使用していることです。

4

1 に答える 1

3

これには簡単なルールがあります。イベントの明示的なサブスクライブ解除が必要になるのは、イベント ソース オブジェクトがイベント サブスクライバー オブジェクトよりも長く存続している場合のみです。

Winforms アプリでは、フォーム オブジェクトとそれに含まれるコンポーネントおよびコントロールが同時に死ぬため、このようなことはほとんどありません。フォームには、Controls コレクションを介してコントロールへの参照があります。コントロールは、そのイベントのデリゲート オブジェクトを介してフォームへの参照を持つことができ、フォーム オブジェクトを存続させることができます。上司の心配。ただし、ガベージ コレクターは、このような循環参照に問題はありません。コントロールおよびイベント デリゲート オブジェクトと同時にフォーム オブジェクトを収集します。

イベント ソース オブジェクトがサブスクライバー オブジェクトよりも長く存続する場合がいくつかあります。Application.Idle イベントと SystemEvents イベントのケース。これらのイベントで注目すべき点は、それらが静的であるため、サブスクライブしているオブジェクト参照をプログラムの存続期間中維持することです。GC は役に立ちません。フォームを閉じてもアプリが終了しない場合は、これらのイベントを明示的に登録解除する必要があります。

自分のコードに疑問がある場合は、メモリ プロファイラーを使用して想定を検証してください。

于 2013-10-07T20:34:53.340 に答える