垃圾回收器无法收集应用程序正在使用的对象,而应用程序的代码可以访问该对象。 那么,就认为应用程序对该对象具有强引用。
弱引用允许垃圾回收器收集对象,同时仍允许应用程序访问该对象。 弱引用仅在不确定的时间内有效,直到对象在没有强引用时被收集。 使用弱引用时,应用程序仍然可以获取对对象的强引用,从而阻止收集该对象。 但始终存在这样的风险:垃圾回收器在重新建立强引用之前先处理该对象。
占用大量内存,但通过垃圾回收功能回收以后很容易重新创建的对象特别适合使用弱引用。
假设 Windows 窗体应用程序中的树视图向用户显示一个复杂的分层选项选择。 如果基础数据很大,则当用户参与应用程序中的其他内容时,将树保留在内存中效率低下。
当用户切换到应用程序的另一部分时,可以使用 WeakReference 该类创建对树的弱引用并销毁所有强引用。 当用户切换回树时,应用程序会尝试获取对树的强引用,如果成功,则避免重新构造树。
若要与对象建立弱引用,请使用要跟踪的对象实例创建一个 WeakReference 。 有关代码示例,请参阅 WeakReference 类库中。
短弱引用和长弱引用
可以创建短弱引用或长弱引用:
简短
垃圾回收功能回收对象后,短弱引用的目标会变为
null
。 弱引用本身是托管对象,与任何其他托管对象一样,受到垃圾回收的约束。 短弱引用是 WeakReference 的无参数构造函数。长整型
在对象的 Finalize 方法已调用后,长弱引用获得保留。 这允许重新创建对象,但对象的状态仍不可预知。 若要使用长引用,请在
true
构造函数中指定WeakReference。如果对象类型不包含 Finalize 方法,应用的是短弱引用功能。弱引用只在目标被收集前有效,运行终结器后可以随时收集目标。
若要建立强引用并再次使用对象,请将Target 的WeakReference 属性转换为该对象对应的类型。 如果Target属性返回null
,则对象已被收集;否则,可以继续使用该对象,因为应用程序已重新获得对该对象的强引用。
使用弱引用指南
仅在必要时使用长弱引用,因为对象状态在最终化后不可预知。
避免使用对小型对象的弱引用,因为指针本身可能很大或更大。
避免使用弱引用作为内存管理问题的自动解决方案。 而是开发用于处理应用程序对象的有效缓存策略。