-2

当我从集合中删除项目时,.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 ?
4

3 回答 3

5

是的,垃圾收集不会使用它,因为它仍然被应用程序中的另一个变量引用。

于 2012-12-20T13:46:37.320 回答
1

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

于 2012-12-20T13:47:38.133 回答
1

myObject是一个引用类型,所以集合只包含对实际对象 的引用。

当你这样做时,myObject removedItem = myObjects[1];你现在有 2 个对 1 个对象的引用。

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

因此,当您这样做时,myObjects.RemoveAt(1);您只能对 1 个对象进行 1 次引用。重要的是,该对象仍然有removedItem引用它的变量

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

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

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

于 2012-12-20T14:27:15.797 回答