C#構造函數和析構函數
C#構造函數和析構函數
在你可以訪問一個類的方法、屬性或任何其它東西之前, ***條執(zhí)行的語句是包含有相應類的C#構造函數和析構函數。甚至你自己不寫一個構造函數,也會有一個缺省的構造函數提供給你。
- class TestClass
- {
- public TestClass(): base() {}
- // 由編譯器提供
- }
一個構造函數總是和它的類名相同,但是,它沒有聲明返回類型。總之,構造函數總是public的,你可以用它們來初始化變量。
- public TestClass()
- {
- // 在這給變量
- // 初始化代碼等等。
- }
如果類僅包含靜態(tài)成員(能以類型調用,而不是以實例調用的成員),你可以創(chuàng)建一個private的構造函數。
- private TestClass() {}
盡管存取修飾符在這一章的后面將要大篇幅地討論,但是private意味著從類的外面不可能訪問該構造函數。所以,它不能被調用,且沒有對象可以自該類定義被實例化。并不僅限于無參數構造函數——你可以傳遞初始參數來初始化成員。
- public TestClass(string strName, int nAge) { …… }
作為一個C/C++程序員,你可能習慣于給初始化寫一個附加的方法,因為在構造函數中沒有返回值。當然,盡管在C#中也沒有返回值,但你可以引發(fā)一個自制的異常,以從構造函數獲得返回值。更多有關異常處理的知識在第七章 "異常處理"中有討論。
但是,當你保留引用給寶貴的資源,應該想到寫一個方法來解決:一個可以被顯式地調用來釋放這些資源。問題是當你可以在析構函數(以類名的前面加"~"的方式命名)中做同樣的事情時,為何還要寫一個附加的方法。
- public ~TestClass()
- {
- // 清除
- }
你應該寫一個附加方法的原因是垃圾收集器,它在變量超出范圍后并不會立即被調用,而僅當間歇期間或內存條件滿足時才被觸發(fā)。當你鎖住資源的時間長于你所計劃的時間時,它就會發(fā)生。因此,提供一個顯式的釋放方式是一個好主意,它同樣能從析構函數中調用。
- public void Release()
- {
- // 釋放所有寶貴的資源
- }
- public ~TestClass()
- {
- Release();
- }
調用析構函數中的釋放方法并不是必要的——總之,垃圾收集會留意釋放對象。但沒有忘記清除是一種良好的習慣。以上介紹C#構造函數和析構函數。
【編輯推薦】