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

發佈了32 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章