5

私がこのようなコンポーネントを持っているとしましょう:

class SomeForm : Form
{
    private Control example;

    public void Stuff()
    {
        this.example = new ComboBox();
        // ...
        this.Controls.Add(example);
    }

    public void OtherStuff()
    {
        this.Controls.Remove(example);
    }
}

Disposeサンプルコントロールを呼び出す責任があるのは誰ですか?から取り外すとthis.Controls廃棄されますか?それとも、このリークバンチのウィンドウハンドルがコントロールを支えていますか?

(参考までに、Windowsフォームデザイナがフォームの子でDisposeを呼び出すコードを生成する場所がわからないため、これを求めています)

4

3 に答える 3

5

Form.Dispose()Controlsコレクション内のコントロールを破棄します。したがって、からコントロールを削除Controlsするには、コントロールを自分で破棄する必要があります。

于 2013-03-01T21:58:12.573 に答える
3

このコントロールを含むフォームが破棄されると、Controlsプロパティに保存したすべてのコントロールが破棄されます。コレクションからカスタムコントロールを削除する必要はありません。含まれているフォームが廃棄されていることを確認してください。

コレクションからコントロールを削除すると、このコントロールは最終的にスコープから外れ、ガベージコレクションで判読できなくなります。GCが実行されると、ファイナライザ/デストラクタが呼び出されます。ファイナライザ/デストラクタは、Formクラスの場合は単にDisposeメソッドを呼び出します。これは、それに依存するのは悪い習慣だと言われています。IDisposableインターフェイスを実装するクラスでの作業が終了したらすぐに、クラスでDisposeメソッドを決定論的に(手動で)呼び出したことを常に確認する必要があります。

于 2013-03-01T21:56:40.287 に答える
0

常に疑わしいソースに移動します。

Form.Dispose次のようになります。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
       ... lots and lots of weird optimized checks ...
       base.Dispose(disposing);

わかりました...FormですContainerControlので:

ContainerControl.Dispose

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this.activeControl = null;
    }
    base.Dispose(disposing);
    this.focusedControl = null;
    this.unvalidatedControl = null;
}

Grrr * ... ok、ContainerControlControl

Control.Dispose

protected override void Dispose(bool disposing)
{
    ... a whole lot of resource reclaiming/funky code ...
     ControlCollection controls = (ControlCollection) 
            this.Properties.GetObject(PropControlsCollection);
     if (controls != null)
     {
         for (int i = 0; i < controls.Count; i++)
         {
              Control control = controls[i];
              control.parent = null;
              control.Dispose();
         }
         this.Properties.SetObject(PropControlsCollection, null);
      }
      base.Dispose(disposing);

あ、はい; フォームを呼び出すDisposeと、そこに含まれるコントロールが破棄されます。

于 2013-03-01T22:05:42.237 に答える