【发布时间】:2010-10-29 15:20:34
【问题描述】:
假设我有一个本身包含集合的集合;例如,字典(字符串,列表(MyClass))。如果我想完全清除集合,在清除父集合之前清除每个单独的子集合是否有意义,如下所示:
For Each ListDef As KeyValuePair(Of String, List(Of MyClass)) In MasterDictionary
Dim ThisList As List(Of MyClass) = ListDef.Value
ThisList.Clear()
Next
MasterDictionary.Clear()
或者这真的只是简单地完成了:
MasterDictionary.Clear()
我想问是否有任何理由——性能、安全性、清晰度等——使用第一种方法。我通常自己使用第二种方法,因为我假设它隐含地实现了第一种方法的作用。但是我们都知道有时假设是多么危险。所以这个问题。
编辑:今天,在我自己的应用程序中,我看到了令人信服的证据,表明在某些情况下第一种方法可能更可取。在我的应用程序中,当用户单击标有“加载数据”的按钮时,会填充一些全局集合(包含列表的字典,如上面的示例代码)。当用户点击“卸载数据”重新开始时,以前我是使用上面的第二种方法清除这些集合。
问题是当用户第二次点击“加载数据”时,应用程序会突然变得很慢。最终它会再次完成对集合的填充,但速度很慢。在我终于尝试了上面的第一种方法之前,我无法弄清楚如何解决这个问题。现在重新加载和重新填充集合的速度与第一次加载一样快。
根据迄今为止发布的答案,听起来我必须有“其他代码”引用子集合;但是,在我看来,它不像我那样。我引用这些孩子的唯一地方是我迭代他们的父母的地方;如果父母被清除,那么他们应该没有代码知道的孩子,对吗?
希望有人可以帮助我了解这些参考资料是如何仍然存在的,或者我忽略了什么。
【问题讨论】:
-
根据您在问题中显示的代码示例,没有理由认为第一个片段的执行与第二个片段有任何不同;在任何一种情况下,最终都会清除顶级字典,并且(据称)没有任何内容引用最初在其中的任何元素。解释第二次加载的性能差异的唯一方法是是否发生了其他事情,但要确定有必要获取有关加载和卸载实际执行的更多信息。
标签: .net list collections dictionary