web-dev-qa-db-ja.com

Dispose機能をC#UserControlに追加するにはどうすればよいですか?

UserControlを実装するクラスがあります。 .NET 2005では、次のようなMyClass.Designer.cs部分クラスファイルにDisposeメソッドが自動的に作成されます。

  protected override void Dispose(bool disposing)
  {
     if (disposing && (components != null))
     {
        components.Dispose();
     }
     base.Dispose(disposing);
  }

独自の破棄機能を追加する場合、どこに配置しますか?このファイルは生成されているため、ここにコードを追加したくはありません。

58
e-holder

このような場合、生成されたDisposeメソッドをメインファイルに移動し、それを拡張します。 Visual Studioはこれを尊重します。

他のアプローチは、部分的な方法を使用することです(C#3.0)。

53
Michael Damatov

すべてのComponentクラスはDisposedイベントを実装します。そのイベントのイベントハンドラーを追加して、そこにあるものをクリーンアップできます。

たとえば、UserControlに次のメソッドを追加できます。

private void OnDispose(object sender, EventArgs e)
{
    // do stuff on dispose
}

そして、コンストラクター(またはLoadイベントハンドラー)で次の行を追加します。

Disposed += OnDispose;
68
Jacob Seleznev

この場合、コードジェネレーターはコードを尊重します。分離コードに配置しても安全です。

7
Micah

VS 2005(および2008)では、Disposeメソッドを更新できます。デザイナーからコントロールを編集しても削除されません。

6
akmad

ユーザーコントロールが継承するコンポーネントクラスのpublic void Dispose()メソッドをオーバーロードする必要があります。

基本メソッドに呼び出しを渡し、機能的に破棄を行うか、完全に実装しない限り機能を破壊することを確認してください

2
user94261

必要に応じて、.designer.csファイルからメインの.csファイルに移動できます。すでに述べたように、上書きされることはありません。

2
Mark Heath

最もクリーンな方法は、コントロールに独自のDisposed()イベントをサブスクライブさせ、そこでクリーンアップすることだと思います。

0
dynamichael