4

私は次のクラスを持っています:

public class NewListBox : ListBox
    {
        public NewListBox()
        {
        }

        private ImageList _myImageList;

        public ImageList ImageList
        {
            get { return _myImageList; }
            set { _myImageList = value; }
        }
     }

このオブジェクトを破棄すると、ImageList などのオブジェクトのフィールドの破棄がトリガーされるかどうか、または Dispose メソッドを実装 (オーバーライド) して自分で行う必要があるかどうかに関心があります。

4

4 に答える 4

6

ImageList をコントロールの Components コレクションに追加する必要があります。そうすれば、Dispose の基本クラスの実装がそのコレクション内のすべてを Dispose するため、Dispose を自分でオーバーライドする必要はありません。

IDisposable であるがコンポーネントではないメンバーがある場合は、コントロールで Dispose をオーバーライドし、それらを自分で Dispose する必要があります。

(コンポーネントという用語は、System.ComponentModel.Component から派生したオブジェクトという厳密な意味で使用しています)。

于 2012-05-17T11:11:01.530 に答える
5

この記事は、メモリの破棄セクションで非常に役立ちます。

IDisposable (すべての Windows フォーム コントロールを含む) を実装するすべてのクラスには、Dispose メソッドがあります。このメソッドは、メモリ以外のリソースを解放するために、オブジェクトが不要になったときに呼び出す必要があります。これには 2 つの方法があります。

  • 手動で (Dispose を明示的に呼び出して)
  • 自動: Form、Panel、TabPage、UserControl などの .NET コンテナーにオブジェクトを追加します。コンテナーは、それが破棄されるときに、そのすべてのメンバーも確実に破棄されるようにします。もちろん、コンテナー自体を破棄する必要があります (または、別のコンテナーの一部にする必要があります)。Windows フォーム コントロールの場合、ほとんどの場合、それらをコンテナーに追加するため、自動破棄に依存しています。
于 2012-05-17T11:15:53.240 に答える
1

投稿したコードに基づいて、Designer を使用してこのコントロールを実装していません。したがって、追加のコントロールを追加できるデザイナー提供のDispose(bool disposing)メソッドやメンバーはありません。System.CompononetModel.IContainer componentsListBox がそのControlsプロパティをどのように処理するかはわかりませんが、ImageListインスタンスをそこに登録できる場合Controls.Add(ImageList)は、自動的にDispose()動作するはずです。

他のオプションはControl.Dispose(bool)、次のようにオーバーライドすることです。

protected override void Dispose(bool disposing)
{
    // Only call Dispose() on members if invoked through a direct
    // call to `Dispose()`. (If disposing is false, that means
    // we are invoked through the finalizer and we should *only*
    // free up unmanaged resources that we *directly* own).
    if (disposing)
    {
        ImageList.Dispose();
    }

    base.Dispose(disposing);
}
于 2014-06-20T17:00:41.060 に答える
1

ここにはさまざまな答えがたくさんあります..

ガベージ コレクターの基本とパフォーマンスのヒントを読むことを強くお勧めし ます。

  • ImageList を手動で破棄して、リソースがすぐに解放されるようにします (ただし、すぐには解放されません)。
  • 何もしない: リソースは、次にガベージ コレクターがあなたが形成した世代を分析するときに解放されます。フォームが閉じられていて、フォームへの参照が保持されていない場合、フォームは破棄され、ImageList への参照がなくなるため、ImageList は破棄されます。リソースは解放されますが、最初のケースより少し遅れます。

ImageListに何千もの大きな画像がある場合(またはフォームを何百回も作成/閉じる場合)を除いて、2つのケースの違いに気付くことはありません

于 2012-05-17T11:52:11.063 に答える