首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >弱参考优势

弱参考优势
EN

Stack Overflow用户
提问于 2008-11-22 01:20:56
回答 3查看 29.9K关注 0票数 74

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

  • 弱references
  • Soft references
  • Phantom references
  • Strong引用。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-22 02:00:53

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

弱引用不会延长对象的生命周期,因此,一旦所有强引用都超出范围,就允许对其进行垃圾回收。它们对于保留初始化成本较高的大型对象很有用,但如果它们不在使用中,则应可用于垃圾回收。

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

票数 61
EN

Stack Overflow用户

发布于 2008-11-22 02:31:20

MSDN对weak references有一个很好的解释。关键的引语在底部,上面写着:

避免使用弱引用作为 automatic solution to memory management problems。相反,应该开发一个有效的缓存策略来处理应用程序的对象。

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

票数 35
EN

Stack Overflow用户

发布于 2014-01-30 04:18:21

Android development tutorial中解释了精彩的WeakReference真实示例。

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

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

代码语言:javascript
复制
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#开发人员可以理解。

来源:http://developersdev.blogspot.ru/2014/01/weakreference-example.html

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/310685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档