FooとBarの2つのクラスがあるとします。 FooはBarとの関係を持っていません。C#:他のオブジェクトを参照しないでオブジェクト間の強い参照を作成する
しかし、fooインスタンスが存続している限り、barインスタンスは生き続ける必要があります。 fooが実際にbarを参照することなく、そうする方法はありますか?
おかげで、 公園
FooとBarの2つのクラスがあるとします。 FooはBarとの関係を持っていません。C#:他のオブジェクトを参照しないでオブジェクト間の強い参照を作成する
しかし、fooインスタンスが存続している限り、barインスタンスは生き続ける必要があります。 fooが実際にbarを参照することなく、そうする方法はありますか?
おかげで、 公園
はConditionalWeakTable Classを見てください。
コンパイラがオブジェクトフィールドを管理対象オブジェクトに動的に付加できるようにします。
これは本質的に、キーと値の両方がWeakReferenceであり、そのキーが生きている限り、値は生きています。
たとえば、あなたは
を定義してはFoo /バーペアを追加することができます。 Barインスタンスは、Fooインスタンスへの参照が存在する限り、生きています。 FooインスタンスのBarインスタンスは、テーブルを参照して見つけることができます。
パーフェクトマジック、魅力のように動作します、ありがとう! – KoenJ
あなたが達成しようとしていることや、「生きている」という意味を正確に知らなくても、示唆を与えるのは難しいです。通常、管理対象オブジェクトの寿命については心配する必要はありません。参照されなくなったときに自然に「死んでしまいます」。
しかし、Foo
インスタンスはBar
インスタンスを参照する必要があります。または、リンクを作成するために他のオブジェクトが両方を参照する必要があります。 System.Object
としてBar
インスタンスへの参照、つまりFoo
はBar
タイプについて知る必要はありません。
バーは、SOMETHINGに参照がある場合にのみファイナライズすることができます。ちょうどFooがそれをBarの手放すことができるときに伝えるようにしてください。
"FooはBarとの関係を持たない(そして持っていない)" .. –
公開オブジェクトフィールドをタイプFooのBarReferenceという名前で作成できますか?
Fooの外にいる誰かが、このプロパティにBarの適切なインスタンスを設定する必要があります。
バーインスタンスへの参照がある限り、GCedされず、オブジェクトFooはBar型について何も知らないオブジェクトを使用します。
"FooはBarとの関係を持たない(そして持っていない)" –
**タイプ** Fooは**タイプ**バーは私が提案するようにオブジェクトを使用する場合。 _semantic_リレーションがない場合は、別のケースです。 – ViktorZ
ガベージコレクタの動作方法を変更しようとするときには、デザインをよく見て、言語内で動作するように変更できるかどうかを確認する必要があります。それは言った:興味深い質問! =) – Jens
些細な解決策を拒否することによって、なぜ人生を困難にするのでしょうか? –
@DavidHeffernanそうすることから彼らを排除する何らかの依存性の問題があるように思えます。 – Steve