C 物件的銷毀和IDisposable

2021-09-06 08:52:14 字數 1376 閱讀 6853

1.物件的析構函式與finalize方法

與c++類似,c#允許程式設計師為類定義乙個」析構函式「:

class

myclass

}

上面的**編譯後,可以看到:

這裡呼叫了object類的finalize方法,這個方法裡面是空的,什麼也沒有。

與建構函式類似,子類的析構函式會自動呼叫基類的析構函式,由此不斷上溯,到最頂層的object。上面顯示了基類的析構函式是在finally裡面執行的,這意味著銷毀物件是先完成子類的清理工作,在完成基類的清理工作。如果基類沒有定義析構函式,則跳過繼續向上搜尋。當clr的gc要**乙個定義了析構函式的物件時,它會自動呼叫finalize方法,而且呼叫finalize方法的時機是不可控的,最好合適的方法就是讓程式設計師主動以完全可控的方式去釋放非託管的資源(例如檔案控制代碼,資料庫連線)。為此,.net提供了idisposable。

idisposable介面只定義了乙個dispose方法,任何乙個希望"手動"**的非託管資源的類都應該實現該介面。

public inte***ce idisposable ,因為clr認為這個介面就是一般的介面,所以不會主動呼叫。這需要程式設計師去呼叫。為了避免資源洩漏,可以這樣:

public

class

myclass:idisposable

public

void

dispose()

}

dispose方法應該允許被呼叫多次而不能引發異常。可以給出比較安全的**框架:

myclass obj = new

myclass();

try

finally

}

c#提供了using關鍵來簡化上述**。using(myclass obj=new myclass())

類的析構函式專用於清理非託管的資源,只有類需要提供乙個在應用程式裡面可隨時呼叫的「顯式」清理資源的功能時,才需要實現idisposable,然而clr的gc不會自動呼叫物件的dispose()方法,只會呼叫finalize方法(也就在析構函式裡面)

idisposable程式設計模式:

public

class

myclass : idisposable

public

void

dispose()

protected

virtual

void dispose(bool

disposing)

//清理非託管資源

} }

C 物件的銷毀和IDisposable

1.物件的析構函式與finalize方法 與c 類似,c 允許程式設計師為類定義乙個 析構函式 class myclass 上面的 編譯後,可以看到 這裡呼叫了object類的finalize方法,這個方法裡面是空的,什麼也沒有。與建構函式類似,子類的析構函式會自動呼叫基類的析構函式,由此不斷上溯,...

C 物件的銷毀機制

銷毀時會按照從後向前的順序銷毀,也就是說,越在後面定義的物件會越早銷毀。其中的原因就是函式是在棧中儲存的,因此,先定義的物件先壓棧,所以在退棧時就會後銷毀。而如果引數有多個的話,大多數編譯器是從右開始壓棧的,也就是引數列表最右邊的變數最先壓棧,所以引數列表最右邊的變數會在最後銷毀。如下 1 incl...

C 物件的建立與銷毀

class x class x class x 轉換建構函式,可以將int轉換為x型別 void f x obj intmain class x 說明這是普通的建構函式,不能在需要型別轉換時呼叫 錯誤原因就是淺拷貝函式把b的 r 和 p 都賦成了a中m的位址。我們這時要自己定義乙個建構函式 拷貝建構...