4

コンテナと呼ばれるユーザーコントロールがあり、実行時に他のユーザーコントロールを追加しています。

コンテナからすべてのコントロールを削除したいのですcontainer.Controls.Clear()が、コントロールはまだメモリに残っています。どうすればそれらをnullにすることができますか?

4

3 に答える 3

8

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

続きを読む:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx

于 2012-05-07T10:47:05.867 に答える
4

パネルがすべての子コントロールを含む親コントロールであると仮定します。したがって、すべての子コントロールをループし、それぞれのdisposeメソッドを呼び出します...これで問題が解決する可能性があります

  while (panel.Controls.Count > 0)
  {
     panel.Controls[0].Dispose();
  } 

clearメソッドを呼び出すと、メモリからではなくコンテナコントロールからコントロールを削除するだけなので、それらを破棄する必要があります...

于 2012-05-07T10:48:01.087 に答える
1

親コンテナを呼び出すDispose()と、子コントロールもすべて実装されていると想定して、すべての子コントロールが破棄されIDisposableます。一般的に、すべてのWinFormsコントロールはIDisposableを実装するため、これは機能するはずです。

そうでない場合(WPFコントロールは暗黙的にアンマネージコードを使用しないため、WPFの場合のように)、コントロールにカスタムクリーンアップメソッドを追加する必要があります。メモリリークの最も一般的な原因の1つは、切り離されていないイベントハンドラです。私は通常、次のようなことをします。

public void CleanUp()
{
    //detach event handlers
    //other cleanup as necessary
}

これは、これを仮想化し、ユーザーコントロールが継承する基本クラスに追加する場合に特に役立ちます。したがってCleanUp()、タイプを確認せずに簡単に呼び出すことができます。IDisposableは主に管理されていないリソースをクリーンアップするためのものであるため、私はIDisposableを実装するよりもこの方法が個人的に好きです。

于 2012-05-07T20:35:38.463 に答える