テキストボックスとボタンを含む単純なWPFシングルウィンドウアプリケーションがあります。また、WPFウィンドウでWindowsフォームのNotifyIconとDateTimePickerを使用します。すべてのコントロールを効果的に破棄するにはどうすればよいですか?
4 に答える
WPF でDispose
メソッドを持つものはほとんどありません。クラスの大部分は、純粋に管理された情報をカプセル化します。オブジェクトをツリーに (たとえばChildren.Add
メソッドを介して) 追加したり、再度削除したりできます。これが状態管理のしくみです。IDisposable
コントロールを削除すると、それを再度追加できるため、パターンには正確には適合しませんが、 /メソッドに加えてコントロールを管理するためにDispose
使用することはできますが)。Dispose
Add
Remove
IDisposable
のように、あるべきなのにそうでないことがいくつかあります。独自のクラスにDispatcherTimer
実装することを妨げるものは何もありません。IDisposable
いつ電話するかはあなた次第ですDispose
。基本的に、オブジェクトをもう使用しないことがわかっている場合。
をWindow
呼び出すだけClose
で、WPF が他のすべてを処理します。
WPFアプリケーションには、他の.NETアプリケーションと同じルールが適用されます。オブジェクトが実装されている場合は、使い終わったらIDisposable
呼び出す必要Dispose
があります。コントロールを動的にロードおよびアンロードし、それらが実装されていない場合、ガベージコレクターがそのジョブを実行するにはIDisposable
、参照を設定するnull
(およびイベントハンドラーをデタッチする)だけで十分です。
CA1001に準拠: 所有する型にIDisposableを実装させます。
すべてのコントロールがIDisposableであるという古い Windows フォームの真実を放棄します。Dispose
自分で実装して呼び出します。
sealed partial class MainWindow : IDisposable {
readonly IDisposable disposable;
public MainWindow() {
disposable = ...
}
public void Dispose() {
disposable.Dispose();
}
protected override void OnClosed(EventArgs e) {
Dispose();
base.OnClosed(e);
}
}
そのコントロールが一部のIContainer(.NETの一般的なモデル)の一部である場合、コントロールにはIDisposableの実装が必要です。したがって、Dispose()は、適切なタイミングで自動的に呼び出されます。