我最近在搜索ConditionalWeakTable<TKey,TValue>时遇到了 IDictionary 类,该类使用弱引用,如答案herehere所示。

a definitive MSDN article介绍了该类,并指出:



然后再次:



与此相符,该类的MSDN条目描述为:



因此很明显,它最初是为特定目的创建的-帮助DLR,而System.Runtime.CompilerServices命名空间体现了这一点。但这似乎已被广泛使用-即使在CLR内部也是如此。例如,如果我在ConditionalWeakTable中搜索ILSpy的引用,则可以看到MEF类 CatalogExportProvider 和内部WPF DataGridHelper类等中都使用了该引用。

我的问题是,在编译器编写和语言工具之外使用ConditionalWeakTable是否可以,并且这样做会带来额外的开销,或者在将来的.NET版本中实现的重大更改是否存在任何风险。 (或者应该避免使用,而是使用像this one这样的自定义实现)。

还需要进一步阅读hereherehere,以了解ConditionalWeakTable如何利用ephemerons的隐藏CLR实现(通过System.Runtime.Compiler.Services. DependentHandle)来解决键和值之间的循环问题,以及如何无法以自定义方式轻松实现此问题。

最佳答案

使用ConditionalWeakTable我没有发现任何问题。如果您需要星历表,则几乎别无选择。

我认为将来的.NET版本不会有问题-即使只有编译器会使用此类,Microsoft仍无法在不破坏与现有二进制文件兼容性的情况下对其进行更改。

至于开销-与普通Dictionary相比肯定会有开销。与普通引用相比,拥有许多DependentHandle可能会昂贵,与多少WeakReference相似(GC必须做额外的工作来扫描它们,以查看是否需要将它们清空)。但这不是问题,除非您有很多(几百万)条目。

关于c# - 是否应该将ConditionalWeakTable <TKey,TValue>用于非编译器目的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10225727/

10-08 21:53