2011-10-26 8 views
12

FooとBarの2つのクラスがあるとします。 FooはBarとの関係を持っていません。C#:他のオブジェクトを参照しないでオブジェクト間の強い参照を作成する

しかし、fooインスタンスが存続している限り、barインスタンスは生き続ける必要があります。 fooが実際にbarを参照することなく、そうする方法はありますか?

おかげで、 公園

+2

ガベージコレクタの動作方法を変更しようとするときには、デザインをよく見て、言語内で動作するように変更できるかどうかを確認する必要があります。それは言った:興味深い質問! =) – Jens

+0

些細な解決策を拒否することによって、なぜ人生を困難にするのでしょうか? –

+0

@DavidHeffernanそうすることから彼らを排除する何らかの依存性の問題があるように思えます。 – Steve

答えて

16

ConditionalWeakTable Classを見てください。

コンパイラがオブジェクトフィールドを管理対象オブジェクトに動的に付加できるようにします。

これは本質的に、キーと値の両方がWeakReferenceであり、そのキーが生きている限り、値は生きています。

たとえば、あなたは

​​

を定義してはFoo /バーペアを追加することができます。 Barインスタンスは、Fooインスタンスへの参照が存在する限り、生きています。 FooインスタンスのBarインスタンスは、テーブルを参照して見つけることができます。

+0

パーフェクトマジック、魅力のように動作します、ありがとう! – KoenJ

0

あなたが達成しようとしていることや、「生きている」という意味を正確に知らなくても、示唆を与えるのは難しいです。通常、管理対象オブジェクトの寿命については心配する必要はありません。参照されなくなったときに自然に「死んでしまいます」。

しかし、FooインスタンスはBarインスタンスを参照する必要があります。または、リンクを作成するために他のオブジェクトが両方を参照する必要があります。 System.ObjectとしてBarインスタンスへの参照、つまりFooBarタイプについて知る必要はありません。

0

バーは、SOMETHINGに参照がある場合にのみファイナライズすることができます。ちょうどFooがそれをBarの手放すことができるときに伝えるようにしてください。

+0

"FooはBarとの関係を持たない(そして持っていない)" .. –

0

公開オブジェクトフィールドをタイプFooのBarReferenceという名前で作成できますか?
Fooの外にいる誰かが、このプロパティにBarの適切なインスタンスを設定する必要があります。
バーインスタンスへの参照がある限り、GCedされず、オブジェクトFooはBar型について何も知らないオブジェクトを使用します。

+0

"FooはBarとの関係を持たない(そして持っていない)" –

+0

**タイプ** Fooは**タイプ**バーは私が提案するようにオブジェクトを使用する場合。 _semantic_リレーションがない場合は、別のケースです。 – ViktorZ

関連する問題