在将一个集合分配给一个项目源清理资源后,将它设置为null吗?

时间:2012-03-25 13:05:29

标签: c# windows-phone-7 collections garbage-collection

我在我的应用程序中进行了一些性能优化,并且我将很多地方分配给列表框的itemssource属性。当我将集合分配到列表框时,是从内存中分配的原始集合。如果没有,通过将其设置为null,它会标记集合以进行垃圾收集吗?

例如:

void myWebServiceCompleted(object sender, List<Item> itemList)
{
    ItemListBox.ItemsSource = itemList;
    //Would setting itemList = null clear up resources?
}

我只是担心,因为这种类型的分配是在应用程序的多个位置进行的,如果上述情况属实,则意味着内存的两倍。

2 个答案:

答案 0 :(得分:1)

不,它不会。 itemList是引用类型。它并不像你想象的那样重复。相反,您只需要多次引用它。这就像在邮件中接收多个字母一样,地址相同。这并不意味着具有该地址的房屋是重复的,只是有多个地址指的是同一栋房屋。

只要一个有根对象仍然引用您的集合,它就不会被垃圾收集器释放。将itemList设置为null不会影响此集合占用的总空间。

  

我只是担心,因为这种类型的分配是在应用程序的多个位置进行的,这意味着内存的两倍。

这并不意味着。我强烈建议你放弃你正在做的一切,阅读有关参考类型的内容,直到你理解了这个非常重要的观点。

我现在明白为什么Joel Spolsky认为每个程序员都应该学习C.

答案 1 :(得分:1)

没有

ListBox包含对原始列表的引用,因此不会对其进行垃圾回收。 如果由于某种原因您希望收集原始列表,您可以手动将ListItem添加到ListBox。

在这种情况下,只要没有其他参考文献,就可以收集原始列表。

我想如果你的集合中的每个项目都是资源丰富的,并且列表框只需要知道几个字段(例如名称和id),这将非常有用