2011-10-26 39 views
12

假設我有2個類Foo和Bar。 Foo沒有(也不能有)與Bar的關係。C#:創建對象之間的強引用,不需要引用另一個對象

不過,我想一欄實例,爲了生存,只要它是富實例保持活着。 有沒有這樣做,沒有富實際參考欄?

感謝, 公園

+2

當你試圖改變垃圾收集器的工作方式,你應該看看你的設計很好看,看它是否是可以改變的語言中工作。這就是說:有趣的問題! =) – Jens

+0

爲什麼拒絕瑣碎的解決方案讓生活變得艱難? –

+0

@DavidHeffernan聽起來像他們有某種依賴性問題,阻止他們這樣做。 – Steve

回答

16

看一看的ConditionalWeakTable Class

使編譯器能夠將對象字段動態附加到託管對象。

它本質上是一個字典,其中的鍵和值都是WeakReference,並且只要鍵處於活動狀態,該值就保持活動狀態。

例如,你可以定義一個

​​

,並添加一個Foo /酒吧對。只要存在對Foo實例的引用,Bar實例就保持活動狀態。您可以通過查看錶找到Foo實例的Bar實例。

+0

完美的魔法,像魅力一樣工作,謝謝! – KoenJ

0

這是很難給出建議,不知道究竟你想什麼來實現,或者你所說的「活着」的意思。通常情況下,您不必擔心託管對象的生命週期:當它們不再被引用時,它們自然會「死亡」。

但要做你看起來想要的事情,要麼你的Foo實例必須引用Bar實例,要麼一些其他對象必須引用這兩者才能創建鏈接。這可能是一個Bar實例的引用作爲System.Object,即Foo並不需要了解Bar類型。

0

如果SOMETHING提及它,Bar只能定稿。只要Foo告訴它什麼時候它可以放開Bar。

+0

「富沒有(也不可能有)的關係吧」 .. –

0

您可以創建一個公共對象領域的Foo類型稱爲BarReference?
Foo以外的人應該將Bar的正確實例設置爲此屬性。
只要有一個對bar實例的引用,它就不會被GCed,並且使用對象Foo不知道任何關於Bar類型的信息。

+0

「富沒有(也不可能有)的關係吧」 –

+0

** **型美孚沒有關係**類型**如果你使用像我建議的對象。如果不存在_semantic_關係,則這是另一種情況。 – ViktorZ

相關問題