从集合中删除的项目仍然有效?

时间:2012-12-20 13:45:06

标签: c# collections observablecollection

当我从集合中删除项目时,.net方面发生了什么? 对删除项的引用是否仍然有效?

class myObject
{
    int i = 1;
}
...
public ObservableCollection<myObject> myObjects = new ObservableCollection<myObject>();
...
myObjects.Add(new myObject());
myObjects.Add(new myObject());

myObject removedItem = myObjects[1];
myObjects.RemoveAt(1);

// removedItem still valid ?

3 个答案:

答案 0 :(得分:5)

是的,它不会被Garbage Collection占用,因为它仍然被应用程序中的另一个变量引用。

答案 1 :(得分:1)

是的,在C#中,只要你持有对象的引用,对象就在那里,垃圾收集器不会释放它的内存。 removedItem是对象的引用。所以是的,您可以毫无问题地使用removedItem引用的对象。

答案 2 :(得分:1)

myObject是一种引用类型,因此集合仅包含引用到实际对象。

执行myObject removedItem = myObjects[1];时,您现在有2个对象的引用。

从集合中删除项目只会删除集合中的引用,而不会删除对象。这是一个重要的概念。

因此,当您执行myObjects.RemoveAt(1);时,您只能参考1个对象。重要的是,对象仍然具有引用它的变量removedItem

当存在对象的引用时,垃圾收集器不会尝试释放内存。

removedItem分配一个不同的值,null,或者它超出范围myObject将没有引用(假设您还没有创建)并被标记为垃圾收集它将不再有效。

然而,实际上,它可能会在内存中停留更长时间,因为垃圾收集器会保证释放内存,但 时它将被释放。 (这最后一部分对你的目的可能并不重要,但值得一提的是。)