在clr中記憶體管理的真正工作是由idisposable介面的dispose()方法和類的析構函式完成的。當有非託管資源需要釋放的時候,通常應該執行finalize()方法來代替析構函式。
idisposable是乙個介面,它並不侷限在c#中,它是microsoft的com技術的一部分,它提供的乙個用於清理不僅僅是c#內的各種型別的元件的通用機制.類似與idisposable的介面使得c#適用於.net框架。idisposable定義了乙個專門的方法,dispose().
在類中如果有必須被釋放的資源,最好的解決方案就是同時使用析構函式和dispose()方法。
首先看一下clr中自動**的效果:
using system;
using system.text;
class dr)",this.ci);}}
class da : idisposable
public void dispose())",this.n);
gc.suppressfinalize(this);
}~da())",this.n);}}
class demo
可以看出clr裡記憶體管理系統自動按變數進棧的順序來消除變數。
如果我改一下:
using system;
using system.text;
class dr)",this.ci);}}
class da : idisposable
public void dispose())",this.n);
gc.suppressfinalize(this);
}~da())",this.n);}}
class demo
d2.dispose();
}
現在可以看出using塊中的d3是自動釋放的,而且也是最先被釋放的,所以在在寫程式的時候,多用using塊是有好處的,呵呵
IDispose和Finalize的區別和聯絡
產生了兩個問題 中紅色標註區域 問題1 為什麼在析構函式中呼叫的是 dispose false 也就是為什麼gc垃圾 機制在 對 象的時候只 或者釋放非託管資源,而不 託管資源?問題2 在 dispose 中 gc.suppressfinalize this 是什麼意思?上網搜了寫資料,終於了解了這...
Finalize和Dispose的區別
兩者都是為了釋放非託管資源,如io控制代碼 資料庫連線等。finalize 基類object定義了受保護的方法finalize,垃圾 器判定物件是垃圾後,會呼叫物件的finalize方法 注意 重寫的都會呼叫 定義 在類名前新增 如 classname finalize由gc隱式呼叫,它在垃圾物件 ...
析構函式和Finalize 之間的那點事
如果我們在類中沒有定義析構函式,則 clr不會自動給這個類新增乙個析構函式。如下 using system using system.collections.generic using system.text namespace ownfinalize 轉換成il 語言如下 class privat...