我有下面描述的课程。 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); };
}
}
答案 0 :(得分:3)
只要a
在范围内,field1
和field2
将保留在范围内。只要Timer
继续运行并引用a
,或者您的C
实例的引用存在,a
将保留在范围内。
我认为你问的是他们是否会丢失,因为我们只是静态地知道A
的实例是A
的一个实例,而不是B
的实例}。答案是否定的,信息仍在范围内。
答案 1 :(得分:1)
由于field1
和field2
都是值类型,因此它们在堆栈/堆上没有自己的位置,它们位于{{实例的内部和部分内存中1}}。这意味着当该类被垃圾收集时,作为清理单个实例的一部分,field1和field2将“消失”。
相反,只要“B”的实例四处移动,B
和field
就会一直存在,因为没有删除整个{{1}实例的垃圾收集方式拥有它们。
答案 2 :(得分:0)
垃圾收集器只删除任何可到达对象中的字段未引用的对象;这就是“垃圾”的定义。只要它们被任何可能找到它们的代码使用,你的对象就不会消失;它们仅在没有运行此类代码时被删除。