【发布时间】:2011-12-06 09:44:21
【问题描述】:
我有一个 TabControl,每个选项卡都包含一个 TradeBookSetViewModel。由于 Tradebook 会变得非常大,因此用户可以根据需要移除这本书。
在 DeleteBook() 上,我只需从 observablecollection 中删除 TradeBookSetViewModel:
_bookSetViewModels.Remove(oldbook);
然后我创建一个新的 emptyBook 作为占位符并将其插入到相同的选项卡位置。该选项卡看起来仍然像持有交易簿一样,但实际上是空的。
为此,我从 Unity Container 中解析了一个新实例,并将 DisplayName 从 oldBook 复制到 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);
目标: 归根结底,我需要 emptyBook 中的 Books 属性不为空,而 oldBook 应该能够被垃圾收集。有什么想法吗?
【问题讨论】:
-
很确定它仍然会被垃圾收集,但是您所指的字典不会被收集,因为您仍在使用它。您可以在该类上放置一个析构函数并调用 GC.Collect() 以查看是否要调用析构函数。
标签: c# .net garbage-collection reference