只是做了一些练习,并通过这个例子进行了突破。我发现早期创建的列表成员的引用仍然存在,为什么?
anotherShoe
和newShoe
仍然具有分配给其参考成员的值,但是如您所见,真实对象已被清除。我知道我可以为它们分配空值,但是当它们的引用对象是List<T>.Clear()
时,它们是否会被自动清空/垃圾收集?
谢谢。
List<Shoe> shoeCloset = new List<Shoe>();
shoeCloset.Add(new Shoe() { styles = Styles.Sneakers, colour = "Red" });
shoeCloset.Add(new Shoe() { styles = Styles.Sandals, colour = "Green" });
shoeCloset.Add(new Shoe() { styles = Styles.Flipflops, colour = "Yellow"});
shoeCloset.Add(new Shoe() { styles = Styles.Loafers, colour = "Brown" });
shoeCloset.Add(new Shoe() { styles = Styles.Wingtips, colour = "Blue" });
//int numberOfShoes = shoeCloset.Count;
//foreach (Shoe shoe in shoeCloset)
//{
// shoe.styles = Styles.Sneakers;
// shoe.colour = "White";
//}
shoeCloset.RemoveAt(3);
Shoe newShoe = shoeCloset[2];
Shoe anotherShoe = shoeCloset[1];
anotherShoe.colour = "Grey";
anotherShoe.colour = "Green";
if (shoeCloset.Contains(anotherShoe))
{
Console.WriteLine("Contains another shoe");
}
shoeCloset.Clear();
anotherShoe.ToString(); //<---this still contains values after shoeCloset has been cleared.
newShoe.ToString(); //<---this still contains values after shoeCloset has been cleared.
答案 0 :(得分:4)
当任何执行代码无法再次访问它们时,对象实例会被垃圾回收。由于您通过两个仍在范围内的局部变量来保留对这两个对象的引用,因此这些对象是可访问的,因此不符合垃圾回收的条件。
垃圾收集的重点是让您不必担心。你永远不会(除了unsafe
代码和弱引用之类的一些边缘情况),尝试访问一个对象并发现你试图访问的对象已被垃圾收集。