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

C# 从集合中删除的项目仍然有效吗?,c#,collections,observablecollection,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

当我从集合中删除项目时,.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 ?
类myObject
{
int i=1;
}
...
公共ObservableCollection myObjects=新ObservableCollection();
...
添加(新的myObject());
添加(新的myObject());
myObject removedItem=myObject[1];
肌对象切除(1);
//removedItem仍然有效吗?

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

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

myObject
是引用类型,因此集合只包含对实际对象的引用

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

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

所以当你做
myObjects.RemoveAt(1)对1个对象的引用减少到1个。重要的是,对象仍然有引用它的变量
removedItem

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

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


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

是的。为什么不试试C++语言中的@ x.L.At,“只是尝试”就不行了。释放的内存可能仍然是意外访问的。我同意你的看法。但在这种情况下,问题恰恰相反:删除的项目是否仍然可以访问?一次尝试就足以发现是的,它是。@X.L.Ant从理论上讲,它可以在测试时访问,但随后进入生产。这就是为什么“只是尝试”不是一个好建议。我注意到VisualStudio调试器在评估此类对象时存在问题。它说:removedItem。我抛出了一个类型为“System.NotSupportedException”的异常