关于GC的解释很少

时间:2012-04-25 14:39:51

标签: c# .net garbage-collection

我有下面描述的课程。 GC是否从类“C”中的对象“a”收集field1和field2?

public abstract class A
{
//some methods and properties
}

public class B : A
{
 public int field1 { get; set; }
 public int field2 { get; set; }
}

public class C
{
 public A a { get; set; }
 private System.Windows.Forms.Timer timer;
 public C()
 {
    a = (A)typeof(B).GetConstructor(bla, bla, bla).Invoke(bla, bla);
    ((B)a).field1 = 25;
    timer = new System.Windows.Forms.Timer();
    timer.Enabled = true;
    timer.Interval = 10000;
    timer.OnTick += (o, e) => { Console.WriteLine(((B)a).field1); }; 
 }
}

3 个答案:

答案 0 :(得分:3)

只要a在范围内,field1field2将保留在范围内。只要Timer继续运行并引用a,或者您的C实例的引用存在,a将保留在范围内。

我认为你问的是他们是否会丢失,因为我们只是静态地知道A的实例是A的一个实例,而不是B的实例}。答案是否定的,信息仍在范围内。

答案 1 :(得分:1)

由于field1field2都是值类型,因此它们在堆栈/堆上没有自己的位置,它们位于{{实例的内部和部分内存中1}}。这意味着当该类被垃圾收集时,作为清理单个实例的一部分,field1和field2将“消失”。

相反,只要“B”的实例四处移动,Bfield就会一直存在,因为没有删除整个{{1}实例的垃圾收集方式拥有它们。

答案 2 :(得分:0)

垃圾收集器只删除任何可到达对象中的字段未引用的对象;这就是“垃圾”的定义。只要它们被任何可能找到它们的代码使用,你的对象就不会消失;它们仅在没有运行此类代码时被删除。