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。
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。
每条线都是一个对象,有两个指针(可能)指向两个点对象,因此如果两条线引用同一个点对象并且其中一个超出范围,则点对象不会,因为第二行仍然包含对它的引用。
如果我理解正确,那么 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 中的点。
l1 引用将得到 GC,但只要引用仍然指向它,它所指向的内容就不会 - 在您的示例中为 l2。
换句话说,l1 和 l2 只是对一个对象(在这种情况下为 Point 类型)的引用,所以只要 l1 和 l2 真的指向同一个对象,如果 GC 忽略了存在仍然是一个指向对象的指针。