我最近遇到ConditionalWeakTable<TKey,TValue>
類,在我的搜索IDictionary
,它使用弱引用,如答案here和here建議。ConditionalWeakTable <TKey,TValue>應用於非編譯目的嗎?
有a definitive MSDN article其推出的類和其中規定:
您可以找到類......在System.Runtime.CompilerServices命名空間。它在CompilerServices中,因爲它不是通用的字典類型:我們打算僅供編譯器編寫者使用。
,後來又說:
...條件弱表並非是一個通用的集合......但是,如果你寫你自己的和必要的.NET語言爲了揭示將屬性附加到對象的能力,您絕對應該查看條件弱表。
與此一致,類的MSDN條目描述如下:
允許編譯器來動態附加對象字段被管理對象。
很顯然它最初是爲了一個特定的目的而創建的 - 幫助DLR和System.Runtime.CompilerServices
命名空間體現了這一點。但它似乎已經找到了比這更廣泛的用途 - 即使在CLR中也是如此。例如,如果我在ILSpy中搜索ConditionalWeakTable的引用,例如,我可以看到它用於MEF類CatalogExportProvider
和內部WPF DataGridHelper
類中。
我的問題是,在編譯器編寫和語言工具之外使用ConditionalWeakTable是否可行,以及在未來的.NET版本中是否會產生額外開銷或實現發生顯着變化的風險。 (或者應該避免使用像this one這樣的自定義實現)。
還有進一步閱讀here,有關ConditionalWeakTable如何利用一個隱藏的CLR實現的ephemerons(通過System.Runtime.Compiler.Services. DependentHandle
)來處理鍵和值之間的週期問題,以及如何能夠不容易實現here和here以自定義的方式。
謝謝,我會將其標記爲答案。我認爲你是對的 - 我想要一個使用弱引用的字典,所以與其他使用弱引用的實現相比,ConditionalWeakTable不應該引入更多的開銷,而使用ephemerons會帶來額外的好處。 – Riko 2012-04-24 08:57:33
我對ConditionalWeakTable的可用性感到非常興奮,但我在文檔中注意到了這一點:「您無法通過重寫Object.GetHashCode來顯式設置密鑰的哈希碼來控制相等比較。ConditionalWeakTable類不會使用Object.GetHashCode方法計算哈希代碼,因此不會調用Object.GetHashCode覆蓋。「 - 使它對我的目的沒用。 :( –
ctrlplusb
2013-03-22 12:28:02
@Sean:「ConditionalWeakTable」無法使用除引用標識之外的任何其他密鑰,因爲它不可能(停止問題)讓它知道代碼何時不再可能提供一個密鑰應該匹配集合中的一個項目。 – supercat 2013-06-04 21:23:10