我有一个TabControl,每个选项卡都包含一个TradeBookSetViewModel。由于Tradebook可以变得很大,因此用户可以根据需要删除该书。

在DeleteBook()上,我只需从observablecollection中删除TradeBookSetViewModel:

_bookSetViewModels.Remove(oldbook);


然后,我创建一个新的emptyBook作为占位符,并将其插入相同的标签位置。该选项卡看起来仍然像是在保存tradeBook,但实际上是空的。

为此,我从Unity容器解析了一个新实例,并将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属性不为null,但是oldBook应该能够被垃圾回收。有什么想法吗?

最佳答案

但这不意味着EmptyBook将指向oldBook,因此不再能够对oldBook进行垃圾回收了吗?


不,除非您没有提到别的东西。

您所拥有的只是两个对象(emptyBookoldbook),它们引用同一个Books词典。这不会在它们之间建立任何引用关系。彼此之间无从得知。

只要oldbook不能从根目录通过另一个引用访问,就可以进行垃圾回收。

10-07 23:58