短弱参考和长弱参考之间有什么区别?

roa*_*oul 5 c# garbage-collection weak-references

我知道以下知识:

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

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

那么,短弱参考和长弱参考之间有什么区别?我想到它如下:(根据msdn)

简短的弱引用:如果GC回收对象,则该对象确实被释放.

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

有人能告诉我更多细节吗?

Ami*_*mit 5

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

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

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

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

使用弱引用的指南

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

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

参考

  • 我想知道为什么那个文件对实际发生的事情的描述如此糟糕?当它的目标有资格立即完成或不存在时,或者当弱引用*本身*有资格完成时,短弱引用将无效。当它的目标不再存在时,或者当弱引用本身有资格被终结时,一个长弱引用将失效。请注意,即使弱引用的目标处于活动状态,它们也可能会失效——文档中没有提到这一点! (2认同)