2

MVVM パターンを使用して Silverlight アプリに取り組んでいます。私のViewModelは現在、モデルオブジェクトのコレクションを表すプロパティで構成されています:

public ObservableCollection<IndexEntry> IndexList
        {
            get;
            set;
        }

また、Web サービスから返されたデータをコレクションに取り込むメソッドもいくつかあります。

このクラスのインスタンスは、アプリケーションの実行時に作成および破棄される可能性があるためIDisposable、プロパティの参照を実装して null に設定する必要がありますか?それとも、このクラスの破棄は、プロパティが参照するコレクションへのすべての参照を削除するのに十分でしょうか? そこにぶら下がっている参照を残す可能性のある警告はありますか?

ありがとう。

4

2 に答える 2

8

参照がガベージコレクションを生き残る唯一の方法は、それがルート化されているかどうかです。ObservableCollectionへの参照を含む、まだ使用中の他のクラスがある場合、それをnullに設定したかどうかに関係なく、ObservableCollectionは破棄されません。たとえば、コレクションである「メモリ内」オブジェクトが1つあるとします。あなたはあなたの財産の中でそれへの1つの参照を持っています。他のコードは、「ObservableCollection <> myOtherReference=YourObject.IndexList;」という行を実行します。現在、実際のメモリオブジェクトへの参照もあります。プロパティ参照をnullにすると、プロパティの参照が削除されるだけです。'myOtherReference'参照は、プロパティではなくメモリを直接指しているため、影響を受けません。

于 2009-01-28T15:23:11.253 に答える
3

GWLlosaはスポットです。さらに、Silverlight データ バインディングは、Binding 参照がある限り、ViewModel を固定したままにします。つまり、ViewModel をビューの DataContext から削除する (View.DataContext=null を設定する) か、ViewModel をリリースする前にビジュアル ツリーからビューを削除する必要があります。IDisposable を実装しても役に立たないので、これはあまりお勧めしません。IDisposable は、管理されていないリソースをクリーンアップするため、または管理されたリソースの破棄をより詳細に制御することを目的としています。この場合、バインディングと参照がどのように機能するかを正しく理解しており、ガベージ コレクターに処理を任せる場合は必要ありません。この記事は次のことに役立ちます。

WPF アプリケーションでのメモリ リークの検出

主に WPF ですが、Silverlight でもこの手法を使用できます。

ところで、あなたが ViewModel を使っているのを見るのはクールです。私はそのパターンの大ファンです。

于 2009-01-28T15:54:58.647 に答える