弱的参考收益

有人可以解释在C#中不同types的引用的主要好处吗?

  • 弱引用
  • 软参考
  • 幻影参考
  • 强烈的参考。

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

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

弱引用不会延长对象的使用寿命,因此一旦所有强引用超出了范围,就可以进行垃圾回收。 它们可以用来保存初始化代价较高的大型对象,但是如果它们不被主动使用,应该可用于垃圾回收。

这是否有助于减less应用程序的内存消耗,完全取决于应用程序的具体情况。 例如,如果你的caching对象数量很less,将来也可能不会被重复使用,那么弱引用可以帮助提高caching的内存消耗。 但是,如果应用程序正在处理大量的小对象,则弱引用会使问题变得更糟,因为引用对象将占用更多或更多的内存。

MSDN对弱引用有很好的解释。 关键引用是在底部它说:

避免使用弱引用作为 内存 pipe理问题 自动解决scheme 。 相反,制定一个有效的caching策略来处理你的应用程序的对象。

每当我在野外看到一个WeakReference时,它就被用作内存pipe理问题的自动解决scheme。 有可能更好的解决scheme,您的应用程序的问题。

在Android开发教程中解释了WeakReference的真实例子。

在视图(ImageView)上有一个图像(位图)和图像容器。 如果图像不是从内存加载(但是例如从磁盘,networking),那么它可以lockingUI线程和屏幕。 为了避免它可以使用asynchronous任务。

asynchronous任务完成时出现问题。 图像容器当时可能根本无用(屏幕更改或者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); } } } } 

PS的例子是在Java中,但可以由C#开发人员理解。
来源: http : //developersdev.blogspot.ru/2014/01/weakreference-example.html