我有一个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进行垃圾回收了吗?
不,除非您没有提到别的东西。
您所拥有的只是两个对象(emptyBook
和oldbook
),它们引用同一个Books
词典。这不会在它们之间建立任何引用关系。彼此之间无从得知。
只要oldbook
不能从根目录通过另一个引用访问,就可以进行垃圾回收。