当我从集合中删除项目时,.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 ?
答案 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
将没有引用(假设您还没有创建)并被标记为垃圾收集它将不再有效。
然而,实际上,它可能会在内存中停留更长时间,因为垃圾收集器会保证释放内存,但 时它将被释放。 (这最后一部分对你的目的可能并不重要,但值得一提的是。)