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