有人可以解释C#中不同类型引用的主要好处吗?
我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域。
答案 0 :(得分:61)
我相信,软件和幻像引用来自Java。一个很长的弱引用(传递给C#的WeakReference构造函数)可能被认为类似于Java的PhantomReference。如果在C#中存在与SoftReference类似的模拟,我不知道它是什么。
弱引用不会延长对象的生命周期,因此一旦所有强引用都超出范围,就允许对其进行垃圾回收。它们可用于保留初始化成本昂贵的大对象,但如果它们没有被主动使用,则应该可用于垃圾收集。
这是否有助于减少应用程序的内存消耗将完全取决于应用程序的细节。例如,如果您有可能会或可能不会在将来重复使用的中等数量的缓存对象,则弱引用可能有助于提高缓存的内存消耗。但是,如果应用程序使用大量小对象,弱引用会使问题变得更糟,因为引用对象将占用更多或更多内存。
答案 1 :(得分:35)
MSDN对weak references有一个很好的解释。关键引用位于底部,表示:
避免将弱引用用作 自动解决内存 管理问题。相反,发展 一个有效的缓存策略 处理应用程序的对象。
每当我在野外看到WeakReference时,它就被用作内存管理问题的自动解决方案。对于您的应用程序的问题,可能有更好的解决方案。
答案 2 :(得分:5)
在Android development tutorial中解释了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);
}
}
}
}
P.S。这个例子是用Java编写的,但C#开发人员可以理解 资料来源:http://developersdev.blogspot.ru/2014/01/weakreference-example.html