参考利益薄弱

有人能解释一下 C # 中不同类型引用的主要好处吗?

  • 参考文献不足
  • 软参考
  • 虚构的引用
  • 很有说服力的推荐信。

我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域。

30018 次浏览

软引用和虚引用来自 Java,我相信。一个长的弱引用(传递到 C # 的 WeakReference 构造函数)可能被认为类似于 Java 的 PhantomReference。如果在 C # 中有类似于 SoftReference 的东西,我不知道它是什么。

弱引用不会延长对象的生命周期,因此一旦所有强引用都超出范围,就可以对其进行垃圾收集。它们对于保存初始化代价高昂的大型对象非常有用,但是如果它们没有被积极使用,那么应该可以用于垃圾收集。

这是否有助于减少应用程序的内存消耗将完全取决于应用程序的具体情况。例如,如果有一定数量的缓存对象悬挂在附近,将来可能会重用,也可能不会重用,弱引用可以帮助改善缓存的内存消耗。但是,如果应用程序使用大量的小对象,弱引用将使问题变得更糟,因为引用对象将占用同样多或更多的内存。

MSDN 对 参考文献不足有一个很好的解释,关键的引用在底部,它说:

避免使用弱引用作为 存储器自动解决方案 管理问题 有效的缓存策略 处理应用程序的对象。

每次我在野外看到 WeakReference 时,它都被用作内存管理问题的自动解决方案。对于应用程序的问题,可能有更好的解决方案。

Android 开发教程中解释了使用 WeakReference 的出色实例。

视图上有一个图像(位图)和图像容器(ImageView)。如果图像不是从内存(而是从磁盘,网络)加载,那么它可以锁定 UI 线程和屏幕。为了避免这种情况,可以使用异步任务。

当异步任务完成时,问题就出现了。图像容器在那个时候一点用都没有(屏幕被改变或者 Android 在滚动之后卸载不可见的视图部分)。WeakReference 可以在这里提供帮助,ImageView 将被垃圾收集。

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;


public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness


// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}

另外,这个例子是用 Java 编写的,但是 C # 开发人员可以理解。
来源: < a href = “ http://developersdev.blogspot.ru/2014/01/owreference-example.html”rel = “ nofollow norefrer”> http://developersdev.blogspot.ru/2014/01/weakreference-example.html