摘 要:構造函數與析構函數是一個類中看似較為簡單的兩類函數,但在實際運用過程中總會出現一些意想不到的運行錯誤。本文將較系統的介紹構造函數與析構函數的原理及在c#中的運用,以及在使用過程中需要注意的若干事項。
關鍵字:構造函數;析構函數;垃圾回收器;非托管資源;托管資源
一.構造函數與析構函數的原理
作為比c更先進的語言,c#提供了更好的機制來增強程序的安全性。c#編譯器具有嚴格的類型安全檢查功能,它幾乎能找出程序中所有的語法問題,這的確幫了程序員的大忙。但是程序通過了編譯檢查并不表示錯誤已經不存在了,在“錯誤”的大家庭里,“語法錯誤”的地位只能算是冰山一角。級別高的錯誤通常隱藏得很深,不容易發現。
根據經驗,不少難以察覺的程序錯誤是由于變量沒有被正確初始化或清除造成的,而初始化和清除工作很容易被人遺忘。微軟利用面向對象的概念在設計c#語言時充分考慮了這個問題并很好地予以解決:把對象的初始化工作放在構造函數中,把清除工作放在析構函數中。當對象被創建時,構造函數被自動執行。當對象消亡時,析構函數被自動執行。這樣就不用擔心忘記對象的初始化和清除工作。
二.構造函數在c#中的運用
構造函數的名字不能隨便起,必須讓編譯器認得出才可以被自動執行。它的命名方法既簡單又合理:讓構造函數與類同名。除了名字外,構造函數的另一個特別之處是沒有返回值類型,這與返回值類型為void的函數不同。如果它有返回值類型,那么編譯器將不知所措。在你可以訪問一個類的方法、屬性或任何其它東西之前, 第一條執行的語句是包含有相應類的構造函數。甚至你自己不寫一個構造函數,也會有一個缺省構造函數提供給你。
| class testclass { public testclass(): base() {} // 由clr提供 } |
| class testclass { public testclass(): base() {} } |
| using system; class point { public double x, y; public point() { this.x = 0; this.y = 0; } public point(double x, double y) { this.x = x; this.y = y; } … } class test { static void main() { point a = new point(); point b = new point(3, 4); // 用構造函數初始化對象 … } } |
| using system.data; class employee { private static dataset ds; static employee() { ds = new dataset(...); } ... } |
| class a { private int x; public a( ) { x = 0; } public a( int i ) { x = i; } }; class b : a { private int y; public b( ) { y = 0; } public b( int i ) { y = i; } public b( int i, int j ):a(i) { y = j; } }; b b1 = new b(); //執行基類a的構造函數a(),再執行派生類的構造函數b() b b2 = new b(1); //執行基類a的構造函數a(),再執行派生類的構造函數b(int) b b3 = new b(0,1); //執行執行基類a的構造函數a(int) ,再執行派生類的 |
| class a { private int x; public a( int i ) { x = i; } }; class b : a { private int y; public b():a(i) { y = 0; } public b(int i):a(i) { y = i; } public b(int i, int j):a(i) { y = j; } }; |
| public class resourceholder { … ~resourceholder() { // 這里是清理非托管資源的用戶代碼段 } } |
新聞熱點
疑難解答