【发布时间】:2015-05-22 06:16:03
【问题描述】:
我在班级Foo 中使用WeakReference<T> (short weak reference) 跟踪对象。这个类有一个析构函数,我需要在其中访问那个被跟踪的对象。我跟踪的对象也在使用WeakReference<Foo> 跟踪Foo。
所以现在我想知道,WeakReference 的“归零”究竟是什么时候发生的?是否所有WeakReference 在运行任何终结器之前都被清空,或者它们每个都在它们跟踪的对象的终结器即将运行之前被清空?
更新
现在我也想知道Mono 项目是否可以阐明这一点(link 1、link 2)。但我有点担心MS GC 和Mono GC 可能会以不同的方式处理这个问题并且不兼容。
【问题讨论】:
-
哇,这令人困惑的文档......它看起来像简短的弱参考文档应该谈论终结,而不是垃圾收集 - 但不清楚。
-
我浏览了旧的 SSCLI 源代码,想看看我能找到什么。还没有找到任何确定的东西,但确实在
Targetgetter 中找到了一个有趣的评论:“应该只在非法使用时发生,比如使用终结器中的 WeakReference”——所以也许你想做的事情无论如何都注定要失败。 -
不是答案,但值得注意的是,您通常应该避免使用析构函数,这很可能是 XY 问题。
-
@HenkHolterman 我正在实现一个弱字典,它应该自动清理无效的弱引用。我很难想象没有析构函数你怎么能做到这一点。
-
需要清理的东西不应该放在弱字典中。
标签: c# memory-management garbage-collection weak-references