2011-07-04 7 views
5

を参照します。C#のガベージコレクションは、C#の

obj1への参照が有効範囲外になっても、obj2への参照がまだない場合、obj1はまだガベージコレクションの対象ですか、またはList<string>オブジェクトへの参照が残っているため依存関係の問題がありますか?

+6

+!良い質問ですが、コードで記入してください。 – harpo

+1

良い質問のようですが、* obj1 *、* obj2 *、List オブジェクトで何が起こっているのか明確ではないので、わかりません...明確にすることはできますか? – Matt

答えて

3

obj1は、ガベージコレクションの資格を得る必要があります。

ここではJon Skeet'sanswerをご覧ください。ガベージコレクションがオブジェクト参照でどのように機能するかを明確に説明しています。

Object's Lifetime in C#の素晴らしいチュートリアルです。

+0

'List 'または 'List 'へのポインタ? – Enigmativity

1

obj1は、obj1自体への参照がない限り、ガベージコレクションの対象となります。あなたのケースでは

+0

これは 'obj1'で定義されたポインタを指し、' List 'のインスタンスが' obj1'で指されていない場合に当てはまります。 – Enigmativity

+0

@Enigmativity:もちろん! :) – Mrchief

-1

obj1がListのメンバーである場合、親Listがガベージコレクションされるまでガベージコレクションには使用できません。

ので:このリストの終わりに

List<string> l = new List<string>(); 

string a = "one"; 
l.Add(a); 

{ 
    string b = "two"; 
    l.Add(b); 
} 

aはスコープ内にある、bは範囲外であるが、両方はまだリストl内の参照を持っていないので、どちらもガベージコレクションの対象となります。

+0

なぜこれが下落したのか分かりません - なぜそれが間違っているのか、あるいは悪い答えがいいのかというコメント。 –

1

OBJ1に私の参照は スコープから外れるが、OBJ2への私の参照は をしません、まだ ガベージコレクションの対象OBJ1ある、または はへの参照がまだあるので、いくつかの 依存関係の問題がある場合リスト オブジェクト?

私が正しくあなたを理解していれば、あなたがobj1obj2の両方を意味するが同じList<string>インスタンスにタイプList<string>との両方の点です。

obj1が範囲外になると、List<string>インスタンスへのアクティブな参照として依然としてobj2が存在するため、リストはガベージコレクションできません。

obj1がヒープ上の参照型の一部(つまりそのプロパティの1つ)であった場合、obj1が占有していたメモリ空間は外部オブジェクトの一部としてガベージコレクトされる可能性があります。 obj1が範囲外になったときにメソッド呼び出しの終わりにスタックがただちに解放されるため、スタック上の単なる参照の場合、GCは関与しません。

obj1は、ヒープ上のオブジェクトへの参照(ポインタとしての方法)に過ぎないことに注意してください。このオブジェクトは、参照がそれ以上参照されていない場合にのみガベージコレクションされます。この質問に定義されているメモリの3つの用途があります

0

  • obj1呼ばList<string>インスタンスへのポインタ。
  • List<string>インスタンスへのポインタは、obj2と呼ばれます。
  • List<string>のインスタンス。

obj1がスコープ外になりますが、obj2しない場合は、唯一の次は、ガベージコレクションの後に残る:

  • obj2呼ばList<string>インスタンスへのポインタ。
  • List<string>のインスタンス。

あなたが安全にList<string>ではなくポインタであるとしてobj1obj2を考えることができるように、そのC#は、ほとんどの場合、ポインタの概念を抽象化覚えておくことが重要であるが、彼らのポインタがあります。

関連する問題