一 對象的生命周期 對象作為類的實例,在程式運行過程中需要占用一定的記憶體空間,.NET公共語言運行時負責其記憶體管理,在對象出生時,為其分配記憶體,在對象銷毀時再收回它所占用的記憶體。 值類型變數在“棧”中管理,棧是一種按照“先進後出”方式存取的記憶體區域。當方法被調用時,方法進棧,方法內的值類型變數(包括 ...
一 對象的生命周期
對象作為類的實例,在程式運行過程中需要占用一定的記憶體空間,.NET公共語言運行時負責其記憶體管理,在對象出生時,為其分配記憶體,在對象銷毀時再收回它所占用的記憶體。
值類型變數在“棧”中管理,棧是一種按照“先進後出”方式存取的記憶體區域。當方法被調用時,方法進棧,方法內的值類型變數(包括行參變數)自動獲取記憶體,當方法調用結束時,這些變數所占用的記憶體會被自動釋放。
引用類型變數在“堆”中管理,在方法調用的過程中,一旦使用了運算符new實例化了對象,.NET公共語言運行時就會立刻在堆中分配記憶體給該對象。而當方法調用結束時候,對象所占用的記憶體不會自動從堆中釋放。在.NET中,對象所占用的記憶體智能有公共語言運行時的垃圾回收器(GC)來回收,垃圾回收器沒有預定的工作模式,他的工作時間間隔是不可預知的,通常在電腦記憶體不足的時候才自動啟動。
圖1-1 對象生命周期
二 構造函數
構造函數的命名與類名相同,它的作用主要用來初始化對象。一個類可以有多個構造函數,即構造函數重載。
. 構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用;而一般的方法是在程式執行到它的時候被調用的;
當一個類只定義了私有的構造函數,將無法通過new關鍵字來創建其對象,當一個類沒有定義任何構造函數,C#編譯器會為其自動生成一個預設的無參的構造函數。
三 析構函數
析構函數的命名是在類名前加“~”的方式命名,它作用是用來回收類的實例所占用的資源,對象在銷毀前,公共語言運行時會自動調用析構函數並使用垃圾回收器回收對象的記憶體空間。
- 每個類只能有一個析構函數,析構函數不能繼承,也不能重載。
- 析構函數沒有修飾符,沒有參數。
- 析構函數中不能包含對Object.Finalize方法的調用,因為公共語言運行時會在析構函數被調用時自動調用Object.Finalize方法。
- 結構中不能定義析構函數。
備註:構造函數是用來創建對象的,每個被創建的對象有自己獨立的屬性和方法。然而實際開發中,有些屬性和方法並不具有特殊性,類的每一個對象其某個屬性或者方法可以完全一致,此時我們可以將此屬性或者方法標為靜態。更多內容請查看“第4篇靜態”。