1

.NETランドの初心者であり、Delphiのバックグラウンドを持っているので、コントロールを動的に作成し、必要に応じて手動で解放することに慣れています。

.netでは、ガベージコレクションなどであるため、コントロールを明示的に解放する必要はないと思います。

私の場合(WinForms)は、他のいくつかのコントロールを含むパネルをflowLayoutPanelに動的に入力します。場合によっては、いくつかのパネルを削除する必要があります。それを達成するために私がしていることは

flowPanel.Controls.Remove(thePanelToRemove);

これには必要な効果があります。パネルはflowLayoutPanelから消えますが、私が得られないのは、ガベージコレクターがコントロールを削除するかどうかです。ユーザーがそれらを削除したときにもう使用されない多くのコントロールを作成するので、それは望ましい動作になります。そうでない場合、どうすればコントロールが解放されることを確認できますか?(擬似コード)のようなもの

flowPanel.Controls.Remove(thePanelToRemove);
thePanelToRemove.Free();

または類似?

4

3 に答える 3

2

簡単な答え:はい、ガベージコレクターはメモリが必要なときにコントロールを削除します。

より長い答え:一部のコントロールは、ガベージコレクターによって解放できないリソースを要求します。これらのコントロールはIDisposableインターフェイスを実装しているため、不要になったときにコントロールのdisposeを呼び出す必要があります。Disposeは、これらの管理されていないリソースをクリーンアップします。

于 2012-05-11T06:38:59.517 に答える
1

これには必要な効果があります。パネルはflowLayoutPanelから消えますが、私が得られないのは、ガベージコレクターがコントロールを削除するかどうかです。

はい、オブジェクトがスコープから外れると、ガベージコレクションの対象になります。.Freeメソッドを呼び出す必要はありません。

于 2012-05-11T06:37:10.563 に答える
1

コントロールが他の何かによって参照されていないと仮定すると、その参照カウントは削除されるとゼロになり、期待どおりにガベージコレクションされます。これは簡略化された説明です(詳細を読みたい場合は以下のリンク)が、完全に管理されたリソースの一般的なルールとして、決定論的な処理とファイナライズについて心配する必要はほとんどありません。

もちろん、コントロールによって参照される管理されていないリソースは、適切に解放および/または廃棄する必要があります。アンマネージリソースには、ファイルストリーム、データベース接続、画像処理用に割り当てられたアンマネージバイト配列への参照、Win32APIから取得したウィンドウへのハンドルなどがあります。

.Netでのガベージコレクションの概要(古い記事ですが、c#4.0のGCの変更を除いて、まだ正確に見えます)。

より多くのガベージコレクション

于 2012-05-11T06:37:18.347 に答える