16

すべての ViewModel の辞書を作成したいと考えています。

   public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();

こんな感じで追加

 vmCollection.Add(name, new WeakReference(viewModel));

そして、このように必要なメソッドを呼び出します..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);

として維持する必要がありWeakReferenceますか? として維持しないと、どのような結果になる可能性がありますかWeakReference

4

2 に答える 2

30

a を使用しない場合の唯一の結果はWeakReference、ディクショナリ内の参照によって、View Model インスタンスがガベージ コレクションされなくなることです。AWeakReferenceはガベージ コレクションを許可します (他に確実な参照がないことを前提としています)。

アイテムへの参照がない場合、そのアイテムはガベージ コレクションの対象になります。WeakReference「可算」参照を作成しないため、一種の参照を保持できますが、それWeakReferenceを見ているのがあなただけである場合でも、それを適格にできます。

それが本当に必要かどうかは、View Models のライフサイクルの種類によって異なります。それらを破棄するか、「手放す」必要がある場合はWeakReference、代わりに辞書から参照を削除する方法を使用または公開する必要があります。

コメントで述べたように。WeakReference関連するオブジェクトのライフサイクルを明示的に処理するのではなく、使用することから遠ざかる傾向があります。とはいえ、関連するポイントでのライフサイクルがまったく見えない場合に役立ちます。あなたの状況では、これらはすべて UI レイヤーにある可能性が高いため、必要な可視性が必要であり、使用しないようにする必要があると思います。

このトピックに関するリソースは次のとおりです。

上記の MSDN リンクからのガイドラインの抜粋:

ファイナライズ後のオブジェクトの状態は予測できないため、長い弱参照は必要な場合にのみ使用してください。

小さなオブジェクトへの弱参照の使用は避けてください。ポインター自体が同じかそれ以上になる可能性があるためです。

メモリ管理の問題に対する自動的な解決策として弱い参照を使用することは避けてください。代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュ ポリシーを作成してください。

最後のガイドライン ポイントがあなたの状況に当てはまると思います。

于 2012-06-07T08:38:20.720 に答える