4

アプリケーションで特定のクラスのオブジェクトのリストを保持したいと考えています。しかし、私はまだオブジェクトをガベージコレクションしたいと思っています。.NET で弱参照を作成できますか?

参考のため:

MSDN からの回答:

オブジェクトとの弱い参照を確立するには、追跡するオブジェクトのインスタンスを使用して WeakReference を作成します。次に、Target プロパティをそのオブジェクトに設定し、オブジェクトを null に設定します。コード例については、クラス ライブラリの WeakReference を参照してください。

4

4 に答える 4

12

はい、一般的な弱参照クラスがあります。

MSDN > 弱参照

于 2008-12-06T22:17:07.370 に答える
5

.NET で弱参照を作成できますか?

はい:

WeakReference r = new WeakReference(obj);

を使用しSystem.WeakReferenceます。

于 2008-12-06T22:17:35.420 に答える
3

はい...

ここにかなり良い例があります:

http://web.archive.org/web/20080212232542/http://www.robherbst.com/blog/2006/08/21/c-weakreference-example/

クラスで、2 つのメンバー変数を作成しました。

WeakReference _weakRef = null;

Person _strongRef = null;

2 つの新しいPersonオブジェクトを作成しました (これらは、この例のために作成した単純なオブジェクトで、Nameプロパティといくつかの参照追跡コードで構成されています)。次に、メンバー変数をオブジェクトの新しく作成されたインスタンスに設定しPersonます。

_strongRef = p;

_weakRef = new WeakReference(p1);

ここでの違いは、コンストラクターでパラメーターとして渡された人物オブジェクトを持つオブジェクトに設定されているの_strongRefに対し、通常の通常の参照であることに気付くでしょう。_weakRefWeakReference(p1)

ガベージ コレクションが発生した場合、または単にテスト目的で、次のように自分で呼び出した場合:

GC.Collect();

次に、メンバー変数p1が保持するターゲット オブジェクトを_weakRefガベージ コレクションする必要があります。チェックするコードを書くことができます:

if (_weakRef.IsAlive)

がまだ生きている場合は、次のようなコードを使用して、を強い参照または通常の参照にWeakReference変換できます。WeakReference

Person p = _weakRef.Target as Person;

現在、p参照は強い参照として扱われ、使用されなくなるまで収集されません。スコープの後に参照を保持したい場合は、それをメンバー変数に設定できます。

于 2008-12-06T22:18:20.067 に答える
0

の完全な (スレッドセーフではない) 実装サンプルを次に示します。WeakReference

ClassA objA = new ClassA();
WeakReference wr = new WeakReference(objA);
// do stuff 
GC.Collect();
ClassA objA2;
if (wr.IsAlive)
    objA2 = wr.Target as ClassA; 
else
    objA2 = new ClassA(); // create it directly if required

WeakReference名前空間にあるSystemため、特別なアセンブリを含める必要はありません。

于 2008-12-10T16:55:30.357 に答える