2010-03-23 71 views
4

是否有任何方式以廣義方式將對象實例(對象A)與第二個對象(對象B)關聯起來,以便在B收集時A成爲可收集的對象?如果B有一個指向A的實例變量,但沒有明確地改變B的類定義,並且能夠以動態的方式做到這一點,那麼會發生同樣的行爲?將對象與另一個對象關聯以進行GC清除

同一類的效果可以通過在一個時髦的方式使用Component.Disposed事件中完成,但我不希望使得B一次性

編輯

我基本上創造與單個「根」對象關聯的對象緩存,而且我不希望緩存爲靜態,因爲可能會有很多使用不同緩存的根對象,因此大量內存將用於根對象不再使用,但緩存的對象仍在周圍。

所以,我想要一個緩存對象的集合與每個'根'對象關聯,而不需要改變根對象的定義。附加到每個根對象實例的附加對象引用的類似元數據的排序。這樣,當收集根對象時,每個集合都會被收集起來,而不會像使用靜態緩存時一樣回收。

+0

如果我理解正確的這個,有一個設計缺陷在這裏。所以如果你的緩存A中有對象B,並且對象Z有對象B的引用,那麼你說A何時離開,你還想讓B也離開?對象Z對B的引用應該發生什麼? – 2010-03-23 14:18:43

+0

不會有對根對象以外的緩存對象的引用。如果有的話,我會希望正常的CLR強烈的引用來確保它不被收集:) – thecoop 2010-03-23 14:24:36

+0

如果A只有B的引用,那麼當A被收集時,B自動變爲有資格收集,因爲不會再有是任何對B的引用。 – 2010-03-23 14:27:15

回答

1

簡答:可能不是。你能解釋一下你想做什麼嗎? WeakReference有可能是你需要的。

1
public class RelatedReference<A, B> 
{ 
    private A a; 
    private B b; 

    public B Referent 
    { 
     get {return b;} 
    } 

    public RelatedReference(A a, B b) 
    { 
     this.a = a; 
     this.b = b; 
    } 
} 

就用RelatedReference每一個地方,你會用b類似這樣:

var Bref = new RelatedReference<A, B>(new A(), new B()); 
    Bref.Referent.Foo(); 
+0

你能否更詳細地解釋這有何幫助? – thecoop 2010-03-23 14:15:52

+0

如果另一個對象有一個對B的引用,B仍然不會被收集。 – 2010-03-23 14:16:03

+0

是的,你必須小心不要設置任何其他引用B.我也同意WeakReference類可能是要走的路。 – 2010-03-23 14:23:40

相關問題