を参照します。C#のガベージコレクションは、C#の
obj1への参照が有効範囲外になっても、obj2への参照がまだない場合、obj1はまだガベージコレクションの対象ですか、またはList<string>
オブジェクトへの参照が残っているため依存関係の問題がありますか?
を参照します。C#のガベージコレクションは、C#の
obj1への参照が有効範囲外になっても、obj2への参照がまだない場合、obj1はまだガベージコレクションの対象ですか、またはList<string>
オブジェクトへの参照が残っているため依存関係の問題がありますか?
、obj1
は、ガベージコレクションの資格を得る必要があります。
ここではJon Skeet's
answer
をご覧ください。ガベージコレクションがオブジェクト参照でどのように機能するかを明確に説明しています。
Object's Lifetime in C#
の素晴らしいチュートリアルです。
'List
obj1は、obj1自体への参照がない限り、ガベージコレクションの対象となります。あなたのケースでは
これは 'obj1'で定義されたポインタを指し、' List
@Enigmativity:もちろん! :) – Mrchief
obj1
がListのメンバーである場合、親Listがガベージコレクションされるまでガベージコレクションには使用できません。
ので:このリストの終わりに
List<string> l = new List<string>();
string a = "one";
l.Add(a);
{
string b = "two";
l.Add(b);
}
、a
はスコープ内にある、b
は範囲外であるが、両方はまだリストl
内の参照を持っていないので、どちらもガベージコレクションの対象となります。
なぜこれが下落したのか分かりません - なぜそれが間違っているのか、あるいは悪い答えがいいのかというコメント。 –
OBJ1に私の参照は スコープから外れるが、OBJ2への私の参照は をしません、まだ ガベージコレクションの対象OBJ1ある、または はへの参照がまだあるので、いくつかの 依存関係の問題がある場合リスト オブジェクト?
私が正しくあなたを理解していれば、あなたがobj1
とobj2
の両方を意味するが同じList<string>
インスタンスにタイプList<string>
との両方の点です。
obj1
が範囲外になると、List<string>
インスタンスへのアクティブな参照として依然としてobj2
が存在するため、リストはガベージコレクションできません。
obj1がヒープ上の参照型の一部(つまりそのプロパティの1つ)であった場合、obj1が占有していたメモリ空間は外部オブジェクトの一部としてガベージコレクトされる可能性があります。 obj1が範囲外になったときにメソッド呼び出しの終わりにスタックがただちに解放されるため、スタック上の単なる参照の場合、GCは関与しません。
obj1は、ヒープ上のオブジェクトへの参照(ポインタとしての方法)に過ぎないことに注意してください。このオブジェクトは、参照がそれ以上参照されていない場合にのみガベージコレクションされます。この質問に定義されているメモリの3つの用途があります
:
obj1
呼ばList<string>
インスタンスへのポインタ。List<string>
インスタンスへのポインタは、obj2
と呼ばれます。List<string>
のインスタンス。obj1
がスコープ外になりますが、obj2
しない場合は、唯一の次は、ガベージコレクションの後に残る:
obj2
呼ばList<string>
インスタンスへのポインタ。List<string>
のインスタンス。あなたが安全にList<string>
ではなくポインタであるとしてobj1
とobj2
を考えることができるように、そのC#は、ほとんどの場合、ポインタの概念を抽象化覚えておくことが重要であるが、彼らのポインタがあります。
+!良い質問ですが、コードで記入してください。 – harpo
良い質問のようですが、* obj1 *、* obj2 *、Listオブジェクトで何が起こっているのか明確ではないので、わかりません...明確にすることはできますか? –
Matt