.net中的垃圾收集

时间:2012-07-10 18:05:16

标签: .net garbage-collection double

Line类引用了Point类的两个对象(如start_Point和end_Point)。 考虑以下情况: 第l1行和第l2行共享一些点(例如l1.end_Point = l2.start_Point)。

现在如果l1超出范围(不再引用l1的对象)但仍然引用了l2, l1的对象是垃圾收集,如果是,那么l1所持有的点对象会发生什么。


从GCRoot到l1.start_Point没有路径,但对于l1.end_Point,有一条路径,即通过l2。

3 个答案:

答案 0 :(得分:1)

每一行都是一个对象,有两个指针(可能)指向两个点对象,所以如果两条线引用同一个点对象而另一条超出范围,则点对象不会,因为第二行仍然包含一个引用它。

答案 1 :(得分:1)

如果我理解正确,Line类的单独实例中的Point对象不会发生任何事情,只要它们在类声明中就像这样:

class Program
{
    static void Main(string[] args)
    {
        Point a = new Point(0,0);
        Point b = new Point(2,2);
        Line line1 = new Line(a.X,a.Y, b.X, b.Y);
        Line line2 = new Line(a.X, a.Y, b.X, b.Y);          
    }
}

class Point
{
    public int X { get; set; }
    public int Y { get; set; }
    public Point(int x1, int y1)
    {
        X = x1;
        Y = y1;
    }
}

class Line
{
    public Point StartPoint { get; set; }
    public Point EndPoint { get; set; }
    public Line(int x1, int y1, int x2, int y2)
    {
        StartPoint = new Point(x1, y1);
        EndPoint = new Point(x2, y2);
    }
}

如果line1超出范围,您仍然可以完全访问第2行中的点。

答案 2 :(得分:0)

l1引用将获得GC,但它指向的内容不会像引用仍指向它一样 - 在您的示例中,l2。

换句话说,l1和l2只是一个对象的引用(在这种情况下是Point类型),所以只要l1和l2确实指向相同的对象,就会有苛刻的结果如果GC忽略了仍然有一个指针保持对象的事实。