2012-04-25 6 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のインスタンスではなく、失われてしまうと思います。その答えはいいえ、情報は範囲にとどまります。 field1field2は、両方の値の種類があるので

+0

Nitpicking:オブジェクトにはスコープがありません。参照にはスコープがあり、オブジェクトには到達可能性がありますが、それは違いです。 – delnan

1

、彼らは、スタック/ヒープ上の自分の場所を持っていない、彼らはの内部にあり、Bのインスタンスのメモリの一部。これは、そのクラスがガベージコレクトされているときに、その単一のインスタンスをクリーンアップする一環として、field1とfield2が "離れる"ことを意味します。それらを所有しているBのインスタンス全体を削除せずにそれらを収集ごみの方法がないため

逆に、限り、「B」のインスタンスは、周りのスティックとして、fieldfield2は固執します。

0

ガベージコレクタは、到達可能なオブジェクトのフィールドで参照されないオブジェクトのみを削除します。それは「ごみ」の定義です。あなたのオブジェクトは、それらを見つける可能性のあるコードによって使用されている限り、消えません。そのようなコードが実行されていない場合にのみ削除されます。

関連する問題