rik*_*koe 32 c# clr garbage-collection weak-references ephemeron
我最近ConditionalWeakTable<TKey,TValue>在我的搜索中遇到了一个IDictionary使用弱引用的类,正如这里和这里的答案中所建议的那样.
有一篇明确的MSDN文章介绍了该类,并指出:
您可以在System.Runtime.CompilerServices命名空间中找到类.... 它在CompilerServices中,因为它不是通用字典类型:我们打算只让编译器编写者使用它.
然后再说:
...有条件的弱表不是一个通用的集合...但是如果你正在编写自己的.NET语言并且需要公开将属性附加到对象的能力,你一定要查看条件弱表.
与此一致,该类的MSDN条目描述如下:
使编译器能够将对象字段动态附加到托管对象.
显然它最初是为了一个非常特定的目的而创建的 - 帮助DLR,System.Runtime.CompilerServices命名空间体现了这一点.但它似乎发现了更广泛的用途 - 即使在CLR中也是如此.例如,如果我在ILSpy中搜索ConditionalWeakTable的引用,我可以看到它在MEF类和内部WPF 类中使用.CatalogExportProviderDataGridHelper
我的问题是在编译器编写和语言工具之外是否可以使用ConditionalWeakTable,以及在未来的.NET版本中是否会产生额外开销或实现变化的风险.(或者应该避免使用像这样的自定义实现).
另外也进一步阅读这里,这里和这里有关如何ConditionalWeakTable利用一个隐藏的CLR实现的ephemerons(通过System.Runtime.Compiler.Services. DependentHandle)来处理键和值之间的周期问题,以及如何能够不容易在一个自定义的方式来完成.
Dan*_*iel 22
我没有看到使用有什么问题ConditionalWeakTable.如果你需要ephemerons,你几乎别无选择.
我不认为未来的.NET版本会出现问题 - 即使只有编译器会使用这个类,微软仍然无法在不破坏与现有二进制文件的兼容性的情况下进行更改.
至于开销 - 与普通字典相比肯定会有开销.拥有许多DependentHandles可能会比昂贵WeakReference的数量更昂贵,因为有多少s 比普通参考更昂贵(GC必须做额外的工作来扫描它们以确定它们是否需要被淘汰).但这不是问题,除非你有很多(数百万)条目.