2012-04-25 3 views
-1

아래에 설명 된 클래스가 있습니다. GC가 클래스 "C"의 객체 "a"에서 field1과 field2를 수집합니까?GC에 대한 약간의 설명이 필요 없습니다.

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

-1 (최악의 타이틀 중 하나) – hivert

답변

3

은 긴 a이 범위에있는 한, field1field2이 범위로 유지된다. Timer이 계속 실행되고 참조 a이거나 인스턴스 C에 대한 참조가 존재하는 한 a은 범위에 남아 있습니다.

나는 우리가 A의 인스턴스를 A의 인스턴스로 정적으로 만 알고 있기 때문에 손실 될 경우 B의 인스턴스가 아니라고 묻습니다. 그 대답은 아니오입니다. 정보는 범위 안에 있습니다.

+0

Nitpicking : 개체에 범위가 없습니다. 참조에는 범위가 있고 객체에는 도달 가능성이 있지만 그 차이가 있습니다. – delnan

1

field1field2은 모두 값 유형이기 때문에 스택/힙에 자체 위치가 없으며 B 인스턴스의 내부 및 내부 메모리의 일부입니다. 즉, 해당 클래스가 가비지 수집 될 때 해당 단일 인스턴스를 정리하는 일부로 field1과 field2가 "사라집니다"라는 의미입니다. 그들을 소유 B의 전체 인스턴스를 삭제하지 않고 그것들을 수집하는 쓰레기의 방법이 없기 때문에

반대로 한 'B'의 인스턴스 주위 스틱으로, fieldfield2는 곁에됩니다.

0

가비지 수집기는 도달 가능한 개체의 필드가 참조하지 않는 개체 만 삭제합니다. 그것이 바로 "쓰레기"의 정의입니다. 객체를 찾을 수있는 코드에서 객체를 사용하는 동안에는 객체가 사라지지 않습니다. 그러한 코드가 실행되지 않을 때에 만 삭제됩니다.

관련 문제