1.對象的析構函數與Finalize方法
與C++類似,C#允許程式員為類定義一個”析構函數“:
上面的代碼編譯後,可以看到:
這裡調用了Object類的Finalize方法,這個方法裡面是空的,什麼也沒有。
與構造函數類似,子類的析構函數會自動調用基類的析構函數,由此不斷上溯,到最頂層的Object。上面顯示了基類的析構函數是在finally裡面執行的,這意味着銷毀對象是先完成子類的清理工作,在完成基類的清理工作。如果基類沒有定義析構函數,則跳過繼續向上搜尋。當CLR的GC要回收一個定義了析構函數的對象時,它會自動調用Finalize方法,而且調用Finalize方法的時機是不可控的,最好合适的方法就是讓程式員主動以完全可控的方式去釋放非托管的資源(例如檔案句柄,資料庫連接配接)。為此,.NET提供了IDisposable。
IDisposable接口隻定義了一個Dispose方法,任何一個希望"手動"回收的非托管資源的類都應該實作該接口。
public interface IDisposable {void Dispose();},因為CLR認為這個接口就是一般的接口,是以不會主動調用。這需要程式員去調用。為了避免資源洩漏,可以這樣:
Dispose方法應該允許被調用多次而不能引發異常。可以給出比較安全的代碼架構:
C#提供了using關鍵來簡化上述代碼。using(MyClass obj=new MyClass()){//使用obj}
類的析構函數專用于清理非托管的資源,隻有類需要提供一個在應用程式裡面可随時調用的“顯式”清理資源的功能時,才需要實作IDisposable,然而CLR的GC不會自動調用對象的Dispose()方法,隻會調用Finalize方法(也就在析構函數裡面)
IDisposable程式設計模式:
讀書筆記《.NET4.0面向對象程式設計漫談》作者:金旭亮老師