为什么物体还活着?

时间:2014-10-08 20:21:13

标签: c# .net list generics

只是做了一些练习,并通过这个例子进行了突破。我发现早期创建的列表成员的引用仍然存在,为什么?

anotherShoenewShoe仍然具有分配给其参考成员的值,但是如您所见,真实对象已被清除。我知道我可以为它们分配空值,但是当它们的引用对象是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.

1 个答案:

答案 0 :(得分:4)

当任何执行代码无法再次访问它们时,对象实例会被垃圾回收。由于您通过两个仍在范围内的局部变量来保留对这两个对象的引用,因此这些对象是可访问的,因此不符合垃圾回收的条件。

垃圾收集的重点是让您不必担心。你永远不会(除了unsafe代码和弱引用之类的一些边缘情况),尝试访问一个对象并发现你试图访问的对象已被垃圾收集。