.NET类库中的小知识:弱引用

1、什么是弱引用?
通常情况下,一个实例如果被其他实例引用了,那么他就不会被GC回收,而弱引用的意思是,如果一个实例没有被其他实例引用(真实引用),而仅仅是被弱引用,那么他就会被GC回收。

2、弱引用的用处。
如果建立了一个类“Class人”,他有个属性 “手”。

private Class手 _手;

public Class手 手 {
    
get return _手; }
}

而在Class手,我希望能够访问“父”,就是人,例如手在收到烫伤后,立即通知“父”:人的子对象“大脑”一个消息“好痛啊”。这个时候,就需要在Class手中定义一个“人”属性,并在Class人初始化时将自己传入。
_手 = new Class手();
_手.人 
= this;
事实上,这样的做法将造成了“循环引用”的问题,这在COM时代的计数器引用方法的时代将是可怕的问题。因为人引用了手,而手又引用了人,如果试图释放人,将先要释放手,但释放手的前提是要释放人,这就是“循环引用”。
       弱引用就是为了解决这个问题,如果人引用手(真引用),但手弱引用了人,这样释放人的时候,先释放手,而释放手将不再需要先释放人。

3、.NET中实现弱引用
在.NET中,MS在最底层就提供了弱引用功能,在System空间中有个WeakReference类。这里是使用这个类的演示(注意:在Set方法中使用Internal只能在.NET中收到支持,如果你使用.NET 1.x请将set单独提取为SetParent方法)
private WeakReference _parentReference;

/// <summary>
/// 返回当前组件的父组件
/// </summary>

public object Parent {
    
get {
        
if (_parentReference != null{
            
return _parentReference.Target;
        }

        
else {
            
return null;
        }

    }

    
internal set {
        
if (value == null{
            _parentReference 
= null;
        }

        
else {
            _parentReference 
= new WeakReference(value);
        }

    }

}
posted @ 2005-08-08 14:55 编写人生 阅读(2569) 评论(6)  编辑 收藏

  回复  引用  查看    
#1楼 2005-08-08 14:58 | Dream world 梦想天空      
hehe,有长知识了
:)
  回复  引用  查看    
#2楼 2005-08-08 16:01 | idior      
如果在数据库中想保持这种父子关系, 将复杂的多.
http://www.alphatom.com/content/view/267/69/
  回复  引用    
#3楼 2005-08-08 17:04 | laserman [未注册用户]
2.中的例子举的不对,.NET处理循环引用不是通过弱引用来实现的,而是通过遍历对象,释放无法访问的对象来完成的。
  回复  引用    
#4楼 2005-08-08 17:42 | 编写人生 [未注册用户]
谢谢 laserman 的指点。
.NET的确不是使用引用计数器的方法,可能是我语言写的不够严谨,造成歧异。
.NET中处理父子关系的方法非常的多,包括传入委托、父对象跟踪事件等方法,我这里只是说这种是比较简单实用的方法。
  回复  引用    
#5楼 2005-08-09 10:05 | laserman [未注册用户]
不用客气,大家一起进步:-)
弱引用的主要作用是处理缓存,由于由.NET来决定何时释放弱引用对象占用的内存,因此,在一些内存紧张的时候能提高性能。
  回复  引用    
#6楼 2005-08-29 15:01 | ss [未注册用户]
fdsafdsfds

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
成果网帮您增加网站收入


相关链接: