假设我有一个本身包含集合的某种集合;例如Dictionary(Of String,List(Of 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()
我在问是否有任何理由 - 性能,安全性,清晰度等 - 使用第一种方法。我自己通常使用第二种方法,因为我假设它隐式地实现了第一种方法。但我们都知道有时会有多危险;因此这个问题。
编辑:今天,在我自己的应用程序中,我看到了有力的证据表明第一种方法在某些情况下可能更可取。在我的应用程序中,我有一些全局集合(包含列表的字典,如上面的示例代码中所示),当用户单击标有“加载数据”的按钮时,这些集合将被填充。当用户点击“卸载数据”从头开始时,以前我正在使用上面的第二种方法清除这些集合。
问题是,当用户第二次点击“加载数据”时,应用程序会突然变得非常慢。最终它会完成收集再次,但在蜗牛的步伐。我无法弄清楚如何解决这个问题,直到我终于尝试了上面的第一种方法。现在重新加载和重新填充集合的过程与第一次加载集合的过程一样快。
根据到目前为止发布的答案,这听起来像我必须有“其他代码的地方”引用子集合;然而,它并不像我那样看着我。我引用这些孩子的唯一地方就是我重复他们父母的地方;如果父母被清除,那么他们应该没有孩子,代码是知道的,对吗?
希望有人可以帮助我理解这些引用是如何仍然徘徊在周围,或者我正在忽略的是怎么回事。
根据您在问题中显示的代码示例,没有理由认为第一个片段与第二个片段的执行方式不同;在任何一种情况下,顶级字典都会在最后被清除,并且没有任何(据称)指的是原来在其中的任何元素。 解释第二次加载时性能差异的唯一方法是发生其他事情,但要确定是否有必要获取有关您的加载和卸载实际执行的更多信息。 – jerryjvl 2009-05-29 02:24:27