-1

我有下面描述的课程。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); }; 
 }
}
4

3 回答 3

3

只要a在范围内,field1就会field2一直在范围内。只要Timer继续运行和引用a,或者对您的实例的引用C存在,a就会保持在范围内。

我认为您要问的是它们是否会丢失,因为我们仅静态知道 of 的实例是A的实例A,而不是 的实例B。答案是否定的,信息仍在范围内。

于 2012-04-25T14:41:57.397 回答
1

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

相反,只要“B”的实例仍然存在,field并且field2会存在,因为没有办法在不删除B拥有它们的整个实例的情况下对它们进行垃圾收集。

于 2012-04-25T14:42:25.383 回答
0

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

于 2012-04-25T14:42:54.253 回答