0

Line クラスは、Point クラスの 2 つのオブジェクト (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 経由のパスが 1 つあります。

4

3 に答える 3

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 に答える
1

各行は、2 つのポイント オブジェクトを (潜在的に) 指している 2 つのポインターを持つオブジェクトです。そのため、2 つの行が同じポイント オブジェクトを参照し、1 つが範囲外になった場合、2 番目の行にはまだ参照が含まれているため、ポイント オブジェクトは参照されません。

于 2012-07-10T18:12:21.157 に答える
0

l1 参照は GC されますが、参照がまだそれを指している限り、それが指しているものはそうではありません-あなたの例では、l2.

つまり、l1 と l2 はオブジェクト (この場合は Point 型) への単なる参照であるため、l1 と l2 が実際に同じオブジェクトを指している限り、GC が存在するという事実を見落とした場合、厳しい結果が生じるでしょう。オブジェクトへのポインタはまだ維持されています。

于 2012-07-10T18:07:32.907 に答える