10

TableLayoutPanelother で動的に満たされる を使用していますTablelayoutPanels

TableLayoutPanel.Controls.Clear今、動的に塗りつぶされたを呼び出すとどうなるのだろうと思っていますTableLayoutPanel。明らかに、すべてのサブレイアウトが削除されますが、それらの子はどうでしょうか? それらも適切に破棄されていますか、それともメモリリークを恐れる必要がありますか?

を呼び出す前に、子の子を再帰的に削除する必要がありClear()ますか?

4

2 に答える 2

17

Clearはコントロールを破棄しないため、メモリ リークが発生します。リンクから:

Clear メソッドを呼び出しても、コントロール ハンドルはメモリから削除されません。メモリ リークを回避するには、Dispose メソッドを明示的に呼び出す必要があります。

ループ内で破棄するとインデックス作成が台無しになるため、コントロール コレクションを別のリストにコピーしてForEachループを実行するか、後方Forループを使用することができます。

 for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose();
  

呼び出すDisposeと、メモリからコントロールが削除されます (GC が取得したとき)。これは、子コントロールのDisposeメソッドの呼び出しも処理します。

1 つのキャッチは、実装するカスタム コントロールがある場合、またはメソッドを呼び出さずにメソッドをIDisposableオーバーライドしている場合です。オブジェクトのメソッドで、スコープ外のイベントからサブスクライブを解除したことを確認する必要があります。そうしないと、その参照によってオブジェクトが存続します。DisposebaseDispose

于 2013-03-23T12:11:59.833 に答える
0

あなたの質問には少し混乱があります。Clear()参照を削除し、オブジェクトはガベージコレクターによって収集されます。

しかし、あなたは単語も使用していますdispose。クリアされたオブジェクトは、それらのメソッドが呼び出されるという意味では破棄されません。Dispose

したがって、これらのオブジェクトをもう使用しておらず、それらを呼び出したいDispose場合は、自分で行う必要があります。

于 2013-03-23T12:09:55.133 に答える