C# 从集合中删除的项目仍然有效吗?
当我从集合中删除项目时,.net端发生了什么? 对删除项的引用仍然有效吗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
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”的异常