IDictionary
,并在这里和这里的答案中发现了ConditionalWeakTable<TKey,TValue>
类。
有一篇权威的MSDN文章介绍了这个类,并指出:
你可以在 System.Runtime.CompilerServices 命名空间中找到这个类。之所以它在 CompilerServices 中是因为它不是通用的字典类型:我们打算让它只能被编译器编写者使用。
稍后又说:
......条件弱表并不是一个通用的集合......但如果您正在编写自己的.NET语言,并需要公开将属性附加到对象的能力,那么您一定要研究条件弱表。
与此相符合的是,该类的MSDN条目描述如下:
使编译器能够动态地将对象字段附加到托管对象。
很明显,它最初是为了帮助DLR而创建的,而System.Runtime.CompilerServices
命名空间体现了这一点。但它似乎发现了比这更广泛的用途 - 即使在CLR内部也是如此。例如,在ILSpy中搜索ConditionalWeakTable的引用时,我可以看到它被用于MEF类CatalogExportProvider
和内部WPF DataGridHelper
类等中。
这里还有更多阅读材料:此处, 此处 和 此处,介绍了ConditionalWeakTable如何利用隐藏的CLR实现弱引用(通过System.Runtime.Compiler.Services.DependentHandle
)来解决键和值之间循环引用的问题,以及为什么无法轻松地以自定义方式完成此操作。
ConditionalWeakTable
使用的键只能使用引用标识(identity),因为它无法确定何时不再有代码提供与集合中项匹配的键,这是不可能的(停机问题)。 - supercat