2012-04-19 47 views
31

我最近遇到ConditionalWeakTable<TKey,TValue>類,在我的搜索IDictionary,它使用弱引用,如答案herehere建議。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)來處理鍵和值之間的週期問題,以及如何能夠不容易實現herehere以自定義的方式。

回答

22

我沒有看到使用ConditionalWeakTable有什麼問題。如果你需要ephemerons,你幾乎別無選擇。

我不認爲未來的.NET版本會成爲一個問題 - 即使只有編譯器會使用這個類,Microsoft仍然無法改變它,而不會破壞與現有二進制文件的兼容性。

至於開銷 - 與普通Dictionary相比,肯定會有開銷。有許多DependentHandle可能會很昂貴,類似於多少WeakReferences比普通參考價格昂貴(GC必須做額外的工作來掃描它們以查看它們是否需要被清除)。但除非你有很多(數百萬)條目,否則這不是問題。

+0

謝謝,我會將其標記爲答案。我認爲你是對的 - 我想要一個使用弱引用的字典,所以與其他使用弱引用的實現相比,ConditionalWeakTable不應該引入更多的開銷,而使用ephemerons會帶來額外的好處。 – Riko 2012-04-24 08:57:33

+0

我對ConditionalWeakTable的可用性感到非常興奮,但我在文檔中注意到了這一點:「您無法通過重寫Object.GetHashCode來顯式設置密鑰的哈希碼來控制相等比較。ConditionalWeakTable 類不會使用Object.GetHashCode方法計算哈希代碼,因此不會調用Object.GetHashCode覆蓋。「 - 使它對我的目的沒用。 :( – ctrlplusb 2013-03-22 12:28:02

+6

@Sean:「ConditionalWeakTable」無法使用除引用標識之外的任何其他密鑰,因爲它不可能(停止問題)讓它知道代碼何時不再可能提供一個密鑰應該匹配集合中的一個項目。 – supercat 2013-06-04 21:23:10

相關問題