析構函數和垃圾回收器在C#中的運用

析構函數是實現銷燬一個類的實例的方法成員。析構函數不能有參數,不能任何修飾符而且不能被調用。由於析構函數的目的與構造函數的相反,就加前綴‘~’以示區別。   雖然C#(更確切的說是CLR)提供了一種新的內存管理機制---自動內存管理機制(Automatic memory management),資源的釋放是可以通過“垃圾回收器” 自動完成的,一般不需要用戶干預,但在有些特殊情況下還是需要用到析構函數的,如在C#中非託管資源的釋放。   資源的釋放一般是通過"垃圾回收器"自動完成的,但具體來說,仍有些需要注意的地方:   

1. 值類型和引用類型的引用其實是不需要什麼"垃圾回收器"來釋放內存的,因爲當它們出了作用域後會自動釋放所佔內存,因爲它們都保存在棧(Stack)中;   

2. 只有引用類型的引用所指向的對象實例才保存在堆(Heap)中,而堆因爲是一個自由存儲空間,所以它並沒有像"棧"那樣有生存期("棧"的元素彈出後就代表生存期結束,也就代表釋放了內存),並且要注意的是,"垃圾回收器"只對這塊區域起作用;   然而,有些情況下,當需要釋放非託管資源時,就必須通過寫代碼的方式來解決。通常是使用析構函數釋放非託管資源,將用戶自己編寫的釋放非託管資源的代碼段放在析構函數中即可。需要注意的是,如果一個類中沒有使用到非託管資源,那麼一定不要定義析構函數,這是因爲對象執行了析構函數,那麼"垃圾回收器"在釋放託管資源之前要先調用析構函數,然後第二次才真正釋放託管資源,這樣一來,兩次刪除動作的花銷比一次大多的。下面使用一段代碼來示析構函數是如何使用的:

 public class ResourceHolder

{ … ~ResourceHolder() {  // 這裏是清理非託管資源的用戶代碼段 } }   

四.小結   構造函數與析構函數雖然是一個類中形式上較簡單的函數,但它們的使用決非看上去那麼簡單,因此靈活而正確的使用構造函數與析構函數能夠幫你更好的理解CLR的內存管理機制,以及更好的管理系統中的資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章