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。
答案 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忽略了仍然有一个指针保持对象的事实。