1. 程式人生 > >NET類庫中的小知識:弱引用

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);
        }
    }
}