2008-10-03 13 views
57

私はUserControlを実装するクラスを持っています。C#UserControlにDispose機能を追加するにはどうすればよいですか?

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

私は自分のDisposeの機能を追加したい場合は、私はそれを置くでしょう:.NET 2005年には、Disposeメソッドが自動的に次のようになりますMyClass.Designer.cs部分クラスファイルに作成されますか?このファイルが生成されているので、私はここにコードを追加して吹き飛ばす危険がありません。

答えて

49

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

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

+3

このシナリオでは、部分的な方法は機能しません。 – Micah

+0

DesignerファイルのDisposeメソッドを拡張して、メインファイルに実装できる部分メソッドの呼び出しを含めることができます。 –

+9

MyClass.Designer.csファイルはすでに部分ファイルであるため、既に生成されたDisposeメソッドに必要なロジックを追加するだけで済みます。メソッドが作成されると、Visual Studioはそのメソッドを上書きしないため、メソッドを変更しても安全です。 –

7

私はこの場合、コードジェネレータがあなたのコードを尊重すると信じています。コードビハインドに配置するのは安全です。

6

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

2

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

63

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

たとえば、あなたのUserControl次のメソッド追加することができますで:

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

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

Disposed += OnDispose; 
+2

@Jacob Seleznev:なぜこれ以上アップビューしなかったのかはっきりしない。多分彼らはそれを見なかったでしょうか? Disposedイベントは、Disposedイベントを、それをサポートするすべてのクラスに廃棄機能を追加する適切な方法だと私は考えています。 – supercat

+1

+1 - 私はこれが現在受け入れられている回答よりも優れているということをsupercatに同意します。 – Joe

+4

私は、イベントは内部からではなくクラス外から処理されると考えています。イベントハンドラを自分自身で上書きし、リソースが解放されるのを防ぐことができると思います。コントロールの内部事項を処理する適切な方法は、基本クラスによって提供される適切な仮想メソッドをオーバーライドすることです。 – Spook

2

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

必ず基本メソッドの呼び出しを渡すだけでなく、機能的にあなたの処分を行っているか、あなたが使用することができ、ユーザーコントロールのためのアンロードイベントがある

+1

これは素晴らしい考えです。 Microsoftが実装した 'System.Windows.Forms.Control'のすべてのサブクラスで、' Dispose(bool disposing) 'をより細かく制御する必要がある場合、サブクラス化してそこで' Dispose'をオーバーライドし、仮想 'DisposeCore' [別の質問の回答](http://stackoverflow.com/a/673304/429091)に記載されているようなメソッドです。 'disposing'パラメータの値を読むことができます*と*はデザイナーファイルの編集を避けます。 Win/win。 – binki

-2

あなたは完全にそれを実装していない限り、あなたは機能を破るよ作りますクリーンアップ、

+3

この質問はWinFormsのUserControlに関するもので、* Unloadedイベントを持っていません。 WPFまたはSilverlightコントロールを意味するのでしょうか? –

0

私はあなたのコントロールを独自のDisposed()イベントに登録し、そこでクリーンアップを行うことが最もクリーンな方法だと思います。

関連する問題