我最近ConditionalWeakTable<TKey,TValue>
在搜索IDictionary
使用弱引用的类时遇到了这个类,正如这里和这里的答案中所建议的那样。
有一篇权威的 MSDN 文章介绍了该类并指出:
您可以在 System.Runtime.CompilerServices 命名空间中找到类 ...。它在 CompilerServices 中,因为它不是通用字典类型:我们打算让它只供编译器编写者使用。
后来又一次:
...条件弱表并非旨在成为通用集合...但是,如果您正在编写自己的 .NET 语言并且需要公开将属性附加到对象的能力,您绝对应该查看 Conditional弱表。
与此一致,该类的 MSDN 条目描述为:
使编译器能够将对象字段动态附加到托管对象。
所以很明显,它最初是为了一个非常特定的目的而创建的——帮助 DLR,而System.Runtime.CompilerServices
命名空间体现了这一点。但它似乎发现了比这更广泛的用途——即使在 CLR 中也是如此。例如,如果我在ILSpy中搜索ConditionalWeakTable的引用,我可以看到它在 MEF 类和内部 WPF类等中使用。CatalogExportProvider
DataGridHelper
我的问题是在编译器编写和语言工具之外使用ConditionalWeakTable是否可以,以及这样做是否存在任何风险,即在未来的 .NET 版本中会产生额外的开销或实现显着变化。(或者应该避免使用类似这样的自定义实现)。
还有进一步的阅读here、here和here关于ConditionalWeakTable如何利用一个隐藏的CLR实现的ephemerons(通过System.Runtime.Compiler.Services. DependentHandle
)来处理键和值之间的循环问题,以及这如何不能以自定义方式轻松完成。