8

テキストボックスとボタンを含む単純なWPFシングルウィンドウアプリケーションがあります。また、WPFウィンドウでWindowsフォームのNotifyIconとDateTimePickerを使用します。すべてのコントロールを効果的に破棄するにはどうすればよいですか?

4

4 に答える 4

6

WPF でDisposeメソッドを持つものはほとんどありません。クラスの大部分は、純粋に管理された情報をカプセル化します。オブジェクトをツリーに (たとえばChildren.Addメソッドを介して) 追加したり、再度削除したりできます。これが状態管理のしくみです。IDisposableコントロールを削除すると、それを再度追加できるため、パターンには正確には適合しませんが、 /メソッドに加えてコントロールを管理するためにDispose使用することはできますが)。DisposeAddRemove

Microsoft フォーラムでのディスカッション。

IDisposableのように、あるべきなのにそうでないことがいくつかあります。独自のクラスにDispatcherTimer実装することを妨げるものは何もありません。IDisposableいつ電話するかはあなた次第ですDispose。基本的に、オブジェクトをもう使用しないことがわかっている場合。

Window呼び出すだけCloseで、WPF が他のすべてを処理します。

于 2009-08-07T06:38:45.193 に答える
1

WPFアプリケーションには、他の.NETアプリケーションと同じルールが適用されます。オブジェクトが実装されている場合は、使い終わったらIDisposable呼び出す必要Disposeがあります。コントロールを動的にロードおよびアンロードし、それらが実装されていない場合、ガベージコレクターがそのジョブを実行するにはIDisposable、参照を設定するnull(およびイベントハンドラーをデタッチする)だけで十分です。

于 2009-08-07T06:16:06.333 に答える
1

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);
    }
}
于 2015-02-23T12:56:10.217 に答える
0

そのコントロールが一部のIContainer(.NETの一般的なモデル)の一部である場合、コントロールにはIDisposableの実装が必要です。したがって、Dispose()は、適切なタイミングで自動的に呼び出されます。

于 2009-08-07T06:34:05.453 に答える