標籤:style blog http color os 使用 ar 資料 sp
NET中的資源分託管和非託管,所謂的託管是指CLR(通用語言運行時)中進行管理的資源,它可以由CLR自動進行記憶體回收. 也就是大家熟知的GC(記憶體回收機制). 而對於 非託管資源,比如資料庫連接,COM串連等,那麼需要手動清理回收資源. 清理非託管資源,我們可以用解構函式來執行,雖然它的執行時機不確定,但終究會被執行. 當然還有Dispose()和Close()方法,兩者的區別在於,Close()後還要以用Open()開啟,而Dispose()則是徹底銷毀.
--- 使用解構函式時,需要GC.Collect()才會執行到(GC,Collect()在自動回收機制中會自動執行,也可以顯式調用它) 而Dispose()需要顯式地調用,或者使用using() ,但是,需要注意:在用解構函式時,至少分兩步走:調用函數,回收記憶體. 那麼,在用using()或*.Dispose()後,GC還會再去執行解構函式. 因此,在Dispose()裡,加上GC.SupressFinalize(this)來防止再次調用解構函式.
總結: Dispose()和Close()需要顯示調用,Dispose()可以通過using()調用.解構函式無法顯式調用. Dispose()和解構函式是銷毀對象,而Close()是關閉,可以通過Open()再開. 解構函式調用時機不確定,而Dispose()在顯式或Using()時執行,Close()在顯式時執行. 三者都是用來銷毀非託管對象. 一段經典的C#-Dispose:
1private bool _isDisposed=false; 2~MyTest() 3 { 4 //this.Close(); 5 Dispose(false); 6 } 7 /**//// <summary> 8 /// 記憶體釋放,需要此類執行個體顯式調用,如sql.Dispose();或Using() 9 /// </summary> 10 public void Dispose() 11 { 12 //IDisposable dispose = this as IDisposable; 13 //if(dispose!=null) 14 //{ 15 // dispose.Dispose(); 16 //} 17 Dispose(true); 18 GC.SuppressFinalize(this); 19 } 20 protected virtual void Dispose(bool disposing) 21 { 22 if(!_isDisposed) 23 { 24 if(disposing) 25 { 26 //託管資源的釋放 27 } 28 //非託管資源的釋放 29 _isDisposed = true; 30 } 31 }
記憶體回收,Dispose,Close,Finalie(C#中的解構函式)