.NET弱引用和强引用

原地址:http://www.cnblogs.com/zhangronghua/archive/2008/03/24/1120479.html

当把一个对象引用分配给一个变量时,该变量就包含对对象的一个强引用(strong reference)。垃圾收集器不会收回强引用仍在使用的对象。只要当变量离开作用域,或者显示地给变量分配null时,强引用才被删除。

      弱引用(weak reference)可以保持对对象的引用,同时允许垃圾收集器在它认为适当的垃圾收集时间释放对象,回收内存。假设有一个对象创建相对便宜,但需耗费大量的内存,如果希望保持这个对象,在应用程序需要使用它,但也希望能够告诉垃圾收集器,在必要时把内存收回。

 

那么.NET为什么要提供弱引用这个功能,这既增加了对象状态的复杂性,也加大了我们学习的难度,好象很不合算吗?其实弱引用还是很有用的,一般认为当满足下列条件时,我们就应该考虑使用弱引用:

  1. 对象稍后可能被使用,但不是很确定。(如果确定要使用,就应该用强引用)
  2. 如果需要,对象可以重新被构造出来(比如数据库构造)。
  3. 对象占相对比较大的内存(一般大于几KB以上)

  好象上面所列的条件很理论很晦涩啊!其实在日常实践中,可以用一句话来概括:弱引用一般用来完成对象的缓存,以提高应用程序的性能。

既然使用弱引用有好处,并且我们又知道了应该在何时使用它,那到底应该如何使用引应用呢?说了这么多,怎么还不说弱引用的使用方法啊?别急,让我们来看一个例子:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> protected void Page_Load( object sender, EventArgs e)
       
{
           
// 声明一个强类型引用对象
            object obj = new object();

            // 注意:这里声明了一个弱引用对象

            System.WeakReference wobj = new WeakReference(

            obj
= null; // 删除强类型引用

            obj
= wobj; 

           
// 下面的两个Response.Write语句都有可能被执行,
           
// 不过一般else下的Response.Write语句执行的机率高些,
           
// 因为GC只有在CLR监测到内存不足时,才进行垃圾收集
            if (null == obj)
           
{
                Response.Write(
"弱类型引用对象被清除");
            }

           
else
           
{
                Response.Write(
"弱类型引用对象可以使用");
            }
     
        }

怎么样,看了上面的例子,是不是发现弱引用的使用是很简单的一件事啊?其实WeakReference类提供了两个构造函数:
WeakReference(object target);
WeakReference(object target, bool trackResurrection);。
如果我们像上面的例子中那样使用第一个构造函数,那traceResurrection将会被置为默认值false。同样我们可以利用第二个构造函数将traceResurrection置为true。那这个参数究竟有什么用呢?其实当traceResurrection为true时,应用程序就可以在对象的Finalize()方法被调用后,但对象的内存还没有真正发生改变(即GC垃圾收集操作的堆碎片清理还没有清理到对象所使用的内存区域)的这段时间里继续访问对象。对于这种情况我们一般称之为“长弱引用”。对应的,当traceResurrection被置为false,我们称之为“短弱引用”。

 最后说一句,虽然有时候长弱引用可以给我们带来一定的方便性,当我们最好避免使用它,因为长弱引用的维护十分困难。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值