当前位置:  开发笔记 > 编程语言 > 正文

参考利益微弱

如何解决《参考利益微弱》经验,为你挑选了3个好方法。

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

弱参考

软参考

幻影参考

强烈的参考.

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



1> Scott Peders..:

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

弱引用不会延长对象的生命周期,因此一旦所有强引用都超出范围,就允许对其进行垃圾回收.它们可用于保留初始化成本昂贵的大对象,但如果它们没有被主动使用,则应该可用于垃圾收集.

这是否有助于减少应用程序的内存消耗将完全取决于应用程序的细节.例如,如果您有可能会或可能不会在将来重复使用的中等数量的缓存对象,则弱引用可能有助于提高缓存的内存消耗.但是,如果应用程序正在处理大量小对象,则弱引用会使问题变得更糟,因为引用对象将占用尽可能多的内存.


另请参阅:[弱引用(MSDN)](http://msdn.microsoft.com/en-us/library/ms404247.aspx)

2> MusiGenesis..:

MSDN对弱引用有很好的解释.关键的报价在底部,它说:

避免使用弱引用作为 内存 管理问题自动解决方案.相反,开发一个有效的缓存策略来处理应用程序的对象.

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


@MusiGenesis:`我认为根本没有用于弱引用`:直到你在启用GC的运行时中发生内存泄漏,因为代码中的某处有一个对树节点的引用,它保留所有引用的树,因此,**尽管它不再使用,但不是**垃圾收集.WeakReference被用作弱引用(双关语):"*如果对象仍在使用中,那么我希望能够用它做一些事情,但如果它不再存在,那么我绝不想成为保持活着的人.*"代码卫生,确定对象的所有权或非所有权.
@paercebal:您似乎在说,弱引用的有效用法是作为代码中其他地方的错误的黑客/解决方法.我想你可以提出这个论点.
事件应始终是弱引用...但不幸的是它们不是默认的.MS有一个[类](http://msdn.microsoft.com/en-us/library/aa970850.aspx)使用弱引用来处理事件,但不幸的是它的语法是残酷的.但幸运的是,[事件库](http://www.codeproject.com/Articles/30066/EventBroker-a-notification-component-for-synchrono)为弱事件提供了简单的语法,以及其他一些改进to events*(例如,简单地让多个发布到同一事件,删除不必要的耦合等)*
我发现引用令人困惑,因为似乎应用程序可以处理每个弱引用的使用.在文档中使用TreeView的示例中,应用程序可以监视用户是否在一段时间内使用了TreeView,如果没有,则将TreeView设置为null,允许垃圾收集器拥有它.这将完成相同的任务,但来自应用程序.
@DGGenuine:就个人而言,我认为根本没有用于弱引用.我在其他开发人员继承的项目中遇到过几次,在每种情况下我都要完全删除它们,因为最初的开发人员并不了解它们是什么以及它们的用途.

3> Artru..:

Android开发教程中解释了WeakReference的精彩实例.

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

异步任务完成时会出现问题.图像容器在那时根本没用(屏幕被更改或Android在滚动后卸载不可见的视图部分).WeakReference可以在这里提供帮助,ImageView将被垃圾收集.

class BitmapWorkerTask extends AsyncTask {
    private final WeakReference imageViewReference;

    public BitmapWorkerTask(ImageView imageView) {
        imageViewReference = new WeakReference(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

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有