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

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

編輯:關於C語言

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


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

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

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

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

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

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

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

四.小結
構造函數與析構函數雖然是一個類中形式上較簡單的函數,但它們的使用決非看上去那麼簡單,因此靈活而正確的使用構造函數與析構函數能夠幫你更好的理解CLR的內存管理機制,以及更好的管理系統中的資源。
注:CLR
CLR(公共語言運行庫)和Java虛擬機一樣也是一個運行時環境,它負責資源管理(內存分配和垃圾收集),並保證應用和底層操作系統之間必要的分離。
為了提高平台的可靠性,以及為了達到面向事務的電子商務應用所要求的穩定性級別,CLR還要負責其他一些任務,比如監視程序的運行。按照.Net的說法,在CLR監視之下運行的程序屬於“受管理的”(managed)代碼,而不在CLR之下、直接在裸機上運行的應用或者組件屬於“非受管理的” (unmanaged)的代碼。
CLR將監視形形色色的常見編程錯誤,許多年來這些錯誤一直是軟件故障的主要根源,其中包括:訪問數組元素越界,訪問未分配的內存空間,由於數據體積過大而導致的內存溢出,等等。

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