我最近在ConditionalWeakTable<TKey,TValue>
课程中遇到IDictionary
使用弱引用的System.Runtime.CompilerServices
,如答案here和here所示。< / p>
有a definitive MSDN article引入了这个类,并说明了哪些:
您可以在System.Runtime.CompilerServices命名空间中找到该类。它在CompilerServices中,因为它不是通用字典类型:我们打算只让编译器编写者使用它。
以后再说:
...条件弱表并不打算成为通用集合......但是如果你正在编写自己的.NET语言并且需要公开将属性附加到对象的能力,你一定要看进入条件弱表。
与此一致,该类的MSDN条目描述为:
使编译器能够将对象字段动态附加到托管对象。
显然,它最初是为了一个非常特定的目的而创建的 - 以帮助DLR,而DataGridHelper
命名空间体现了这一点。但它似乎发现了更广泛的用途 - 即使在CLR中也是如此。例如,如果我在ConditionalWeakTable中搜索ILSpy的引用,我可以看到它在MEF类CatalogExportProvider
和内部WPF System.Runtime.Compiler.Services. DependentHandle
类中使用,以及其他
我的问题是在编译器编写和语言工具之外是否可以使用ConditionalWeakTable,以及在将来.NET中产生额外开销或实现变化方面是否存在任何风险版本。 (或者应该避免使用像this one这样的自定义实现)。
还有here,here和here进一步阅读ConditionalWeakTable如何使用ephemerons的隐藏CLR实现(via {{ 1}})处理键和值之间的循环问题,以及如何以自定义方式轻松完成。
答案 0 :(得分:22)
我认为使用ConditionalWeakTable
没有任何问题。如果你需要ephemerons,你几乎别无选择。
我不认为未来的.NET版本会出现问题 - 即使只有编译器会使用这个类,微软仍然无法在不破坏与现有二进制文件的兼容性的情况下进行更改。
至于开销 - 与普通词典相比肯定会有开销。拥有许多DependentHandle
可能会比昂贵WeakReference
比普通参考更昂贵(GC必须做额外的工作来扫描它们以确定它们是否需要被淘汰)。但除非你有很多(数百万)条目,否则这不是问题。