程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#中構造函數和析構函數的用法(3)

C#中構造函數和析構函數的用法(3)

編輯:關於C語言

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

析構函數是實現銷毀一個類的實例的方法成員。析構函數不能有參數,不能任何修飾符而且不能被調用。由於析構函數的目的與構造函數的相反,就加前綴‘~'以示區別。

雖然C#(更確切的說是CLR)提供了一種新的內存管理機制---自動內存管理機制(Automatic memory management),資源的釋放是可以通過“垃圾回收器” 自動完成的,一般不需要用戶干預,但在有些特殊情況下還是需要用到析構函數的,如在C#中非托管資源的釋放。

資源的釋放一般是通過"垃圾回收器"自動完成的,但具體來說,仍有些需要注意的地方:

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

2. 只有引用類型的引用所指向的對象實例才保存在堆(Heap)中,而堆因為是一個自由存儲空間,所以它並沒有像"棧"那樣有生存期("棧"的元素彈出後就代表生存期結束,也就代表釋放了內存),並且要注意的是,"垃圾回收器"只對這塊區域起作用;

然而,有些情況下,當需要釋放非托管資源時,就必須通過寫代碼的方式來解決。通常是使用析構函數釋放非托管資源,將用戶自己編寫的釋放非托管資源的代碼段放在析構函數中即可。需要注意的是,如果一個類中沒有使用到非托管資源,那麼一定不要定義析構函數,這是因為對象執行了析構函數,那麼"垃圾回收器"在釋放托管資源之前要先調用析構函數,然後第二次才真正釋放托管資源,這樣一來,兩次刪除動作的花銷比一次大多的。下面使用一段代碼來示析構函數是如何使用的:

public class ResourceHolder
{

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

四.小結

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved