我最近在搜索ConditionalWeakTable<TKey,TValue>
时遇到了 IDictionary
类,该类使用弱引用,如答案here和here所示。
有a definitive MSDN article介绍了该类,并指出:
然后再次:
与此相符,该类的MSDN条目描述为:
因此很明显,它最初是为特定目的创建的-帮助DLR,而System.Runtime.CompilerServices
命名空间体现了这一点。但这似乎已被广泛使用-即使在CLR内部也是如此。例如,如果我在ConditionalWeakTable中搜索ILSpy的引用,则可以看到MEF类 CatalogExportProvider
和内部WPF DataGridHelper
类等中都使用了该引用。
我的问题是,在编译器编写和语言工具之外使用ConditionalWeakTable是否可以,并且这样做会带来额外的开销,或者在将来的.NET版本中实现的重大更改是否存在任何风险。 (或者应该避免使用,而是使用像this one这样的自定义实现)。
还需要进一步阅读here,here和here,以了解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/