7

我知道以下知识:

弱引用允许垃圾收集器收集对象,同时仍允许应用程序访问该对象。

因此,如果对象已被回收,则必须在必要时再次创建它。

那么,短弱引用和长弱引用有什么区别呢?我认为它如下:(根据msdn)

短弱引用:如果 GC 回收了对象,那么对象就真的被释放了。

长弱引用:如果 GC 回收对象,该对象仍然存在(因为它被缓存了)。

那么有人可以告诉我更详细的信息吗?

4

1 回答 1

4

短的

当对象被垃圾回收回收时,短弱引用的目标变为空。弱引用本身就是一个托管对象,并且像任何其他托管对象一样受到垃圾回收的影响。短弱引用是WeakReference的默认构造函数。

调用对象的 Finalize 方法后,将保留一个长的弱引用。这允许重新创建对象,但对象的状态仍然不可预测。要使用长引用,请在 WeakReference 构造函数中指定 true。

如果对象的类型没有 Finalize 方法,则应用短弱引用功能,并且弱引用仅在目标被收集之前有效,这可能在终结器运行后的任何时间发生。

要建立强引用并再次使用对象,请将WeakReference的 Target 属性强制转换为对象的类型。如果 Target 属性返回 null,则表示该对象已被收集;否则,您可以继续使用该对象,因为应用程序已重新获得对它的强引用。

使用弱引用的指南

仅在必要时使用长弱引用,因为对象的状态在完成后是不可预测的。避免对小对象使用弱引用,因为指针本身可能一样大或更大。

避免使用弱引用作为内存管理问题的自动解决方案。相反,开发一个有效的缓存策略来处理您的应用程序的对象。

参考

于 2013-07-09T08:16:06.937 回答