22

MVVM-light (V3 SP1) の最新バージョンでは、ViewModel クラスの「Dispose()」メソッドと「Dispose(bool)」メソッドの両方がマークされています。

このメソッドは今後使用しないでください。将来のバージョンで削除される予定です。代わりに ICleanup.Cleanup() を使用してください

これは、GalaSoft.MvvmLight.ViewModelBase から派生したすべての ViewModel クラスで IDisposable インターフェイスを実装してはならない (およびクリーンアップをオーバーライドする必要がある) ことを意味しますか?

はいの場合、view-model インスタンスに using を使用することはできません...おそらく何か理解できませんでした...明確にしてください...そのようなクリーンアップの利点は何ですか?

ありがとう。

4

3 に答える 3

30

この問題は歴史的なものです。最初は、すべてのVMを強制的にIDisposableにするのが良い考えだと思いました。ただし、IDisposableの目的は異なります。VMが破棄されると、(慣例により)できるだけ早くガベージコレクションされることが期待されます。友人と話をした後、すべてのVMをIDisposableにするのは間違いであることに気付きました。これが、IDisposableをICleanupに置き換えた理由です。ICleanupの目的は、VMをクリーンアップする方法(たとえば、永続ストレージへの状態のフラッシュ、ストリームのクローズなど)を提供することですが、必ずしもできるだけ早くガベージコレクションされる方法ではありません。

VMにIDisposableを実装させることを妨げるものは何もありません。この制約をViewModelBaseクラスに保持したくなかったため、このインターフェイスはV4で削除されます。

ICleanupを使用する利点は、ViewModelLocator.Cleanup()を1回呼び出すだけですべてのVMをクリーンアップできることです。これは、VMがVMにクリーンアップ方法を提供することを検討する必要があると言っているVM開発者へのヒントです。

それは理にかなっていますか?乾杯、ローラン

于 2010-06-04T09:17:52.503 に答える
3

「興味深い」ちょっとした話: 私のチームのプログラマーがイベントのサブスクライブを解除していないことがわかったので、IDisposable をビュー モデル階層に「洗い流して」、Dispose が適切な場所であるかどうかについて考えを変えるだけでした。

状況によっては、MEF や、ビュー モデルを作成するその他のファンキーな方法が原因で、Dispose を呼び出すのが困難でした。これは正しいかどうか疑問に思いました。そして、Dispose を正しく行うには、注意 (およびスニペット) が必要であるという事実があります。

DG の更新: 破棄、ファイナライズ、およびリソース管理

その後、WP7 アプリ (ここで MVVM Light を使用) で週末の作業を行ったところ、Laurent の心変わりにも気付きました。

正しい決断だと思います。IDisposable は、「顧客」がクラスの使用法を using() でラップするか、そうでなければできるだけ早くインスタンスの手を洗う必要があるというメッセージを送信します。

当初、私は以下のスレッドで受け入れられた回答に同意しましたが、その後、JaredPar が正しいと考えるようになりました。

IDisposable を使用してイベントのサブスクライブを解除する

ルーク

于 2011-06-20T09:56:47.557 に答える
2

この点でローランとは少し違うと思います。IDisposableの背後にある考え方は、オブジェクトに実行する必要のあるクリーンアップが含まれている可能性があり、それ自体はガベージコレクションとは関係がないということです。実際、ほとんどの場合、IDisposableは、GCの範囲外にあるファイルハンドル、同期オブジェクト、データベース接続などの管理されていないリソースをクリーンアップするために実装されます。さらに、基本クラスがIDisposableを実装しているからといって、実際に実装する必要があるわけではありません。これは、仮想Dispose(bool disposed)メソッドに任せることができます。このメソッドは、派生クラスによってオーバーライドできるため、クリーンアップを実行できます。

Buddaがほのめかしているように、問題はIDisposableが慣例的に一方向の操作であるということです。オブジェクトが破棄されると、パブリックメソッドでObjectDisposedExceptionをスローする必要があります。オブジェクトを再利用できるようにリソースをフラッシュするだけの場合は、Cleanupメソッドが理にかなっています。ただし、別の目的を果たすDispose機能を必ずしも削除するわけではありません。

于 2011-03-14T15:26:57.363 に答える