-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、範囲内field1field2とどまります。Timerが実行を継続し、参照a、またはのインスタンスへの参照がC存在する限りa、スコープ内に残ります。

AのインスタンスとしてでAはなく、のインスタンスとしてのみ静的に認識しているため、それらが失われるかどうかを尋ねていると思いますB。その答えはノーです。情報は範囲内にとどまります。

于 2012-04-25T14:41:57.397 に答える
1

field1とは両方とも値型であるためfield2、スタック/ヒープ上に独自の場所はなく、のインスタンスのメモリの内部と一部にありますB。これは、そのクラスがガベージコレクションされると、その単一インスタンスのクリーンアップの一環として、field1とfield2が「削除」されることを意味します。

逆に、「B」のインスタンスが存続している限り、それらを所有しているインスタンス全体を削除せずにガベージコレクションを行う方法がないためfield、存続します。field2B

于 2012-04-25T14:42:25.383 に答える
0

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

于 2012-04-25T14:42:54.253 に答える