0

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。

4

3 回答 3

1

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

于 2012-07-10T18:12:21.157 回答
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 超出范围,您仍然可以完全访问 line2 中的点。

于 2012-07-10T18:41:26.253 回答
0

l1 引用将得到 GC,但只要引用仍然指向它,它所指向的内容就不会 - 在您的示例中为 l2。

换句话说,l1 和 l2 只是对一个对象(在这种情况下为 Point 类型)的引用,所以只要 l1 和 l2 真的指向同一个对象,如果 GC 忽略了存在仍然是一个指向对象的指针。

于 2012-07-10T18:07:32.907 回答