私はTabControlを持っており、各タブにはTradeBookSetViewModelが含まれています。 Tradebookがかなり大きくなるので、ユーザーは必要に応じて本を削除することができます。この参照はメモリリークを引き起こしますか?
DeleteBook(オン)私は単にのObservableCollectionからTradeBookSetViewModelを削除:
_bookSetViewModels.Remove(oldbook);
その後、私はプレースホルダとして新しいemptyBookを作成し、同じタブ位置に挿入します。このタブはまだtradeBookを保持しているように見えますが、実際は空です。
私はUnity Containerから新しいインスタンスを解決し、oldBookのDisplayNameをemptyBookにコピーします。
BookSetViewModel emptyBook = _container.Resolve<BookSetViewModel>();
emptyBook.DisplayName = oldbook.DisplayName;
_bookSetViewModels.Insert(positionOfDisposedTab, emptyBook);
これまでのところとても良いです。
しかし、後で私はemptyBookがBooksのプロパティも必要と認識しました。プロパティBooksはタイプDictionary<string, CustomClassItem>
であるため、私はDisplayNameで行ったのと同じことをまず行うことができたと思いました。
emptyBook.Books = oldbook.Books;
しかし、それはemptyBookがoldBookを参照することになるので、oldBookはゴミがもはや収集することができないことを意味ことができませんでしたか?
は、たぶん私はだけではなく、このように辞書のクローンを作成する必要があります
emptyBook.Books = book.Books.ToDictionary(entry => entry.Key, entry => entry.Value);
目標:一日の終わりに、私がnullでないことをemptyBook洋書プロパティを必要とし、まだoldBook条ガベージコレクションをすることができます。何かご意見は?
まだガベージコレクトされていますが、あなたが参照している辞書はまだ使用しているので収集されません。クラスにデストラクタを置いて、GC.Collect()を呼び出して、テストする場合にデストラクタが呼び出されるかどうかを調べることができます。 –