- C# 2012程序設計實踐教程 (清華電腦學堂)
- 張冬旭
- 1555字
- 2021-03-26 17:16:29
3.2 類的函數
在實例化類時經常會用到函數,本節介紹類的兩種函數,即構造函數和析構函數。一般情況下,可以將構造函數稱為構造方法,析構函數稱為析構方法。
3.2.1 構造函數
任何時候,只要創建類或結構,就會調用它的構造函數。類或結構可能有多個接受不同參數的構造函數。構造函數使程序員可以設置默認值、限制實例化以及編寫靈活且便于閱讀的代碼。
構造函數的名稱與類名相同,能夠在構造函數中定義參數,但是不能有返回類型。每一個類中必須有一個構造函數,如果開發者沒有為對象提供一個構造函數,那么默認情況下C#會創建一個構造函數,該構造函數實例化對象,并且將成員變量設置為默認值表中列出的默認值。例如,在范例2中,通過new關鍵字實例化BookType類時,調用的就是無參構造函數。
【范例3】
通過手動方式聲明BookType類的無參構造函數,代碼如下。
public class BookType { public BookType() { Console.WriteLine("這是無參的構造函數"); } /* 省略其他代碼 */ }
重新運行Program.cs文件,輸出結果如下。
這是無參的構造函數 這是無參的構造函數 第一本圖書類型:校園小說 第二本圖書類型:旅游雜志
從上述輸出結果可以看出,每次通過new BookType()實例化BookType類的對象時都是調用的無參構造函數,并且輸出“這是無參的構造函數”的提示信息。
除了聲明無參的構造函數外,還可以創建有參的構造函數,有參構造函數也很簡單,下面通過范例4說明。
【范例4】
在范例3中,BookType類包含一個無參構造函數、一個公有字段和一個公有方法。在前面代碼的基礎上添加新代碼,向BookType類添加一個有參的構造函數,在該函數中傳入一個string類型的typename參數,代碼如下。
public BookType(string typename) { this.typeName = typename; Console.WriteLine("調用有參構造函數"); }
向Program.cs文件的Main()方法中加入新代碼,直接通過BookType類的有參構造函數實例化對象,代碼如下。
BookType booktype3 = new BookType("穿越小說"); Console.WriteLine("第三本圖書類型:"+booktype3.TypeName);
從上述代碼中可以看出,通過有參的構造函數可以直接傳入一個圖書類型的名稱作為參數,而不必再通過“對象.字段名”進行賦值。重新運行Program.cs文件,輸出結果如下。
這是無參的構造函數 這是無參的構造函數 第一本圖書類型:校園小說 第二本圖書類型:旅游雜志 調用有參構造函數 第三本圖書類型:穿越小說
注意
如果為類聲明了一個有參的構造函數,那么必須顯式創建一個無參的構造函數。如果不創建無參的構造函數,那么在調用無參構造函數時會出現錯誤。
一個類可以有多個有參的構造函數,開發者可以根據需要進行創建。如在BookType類中,不僅可以包含表示圖書類型名稱的typeName字段,當然還可以包含圖書編號的typeId字段。在聲明有參構造函數時,函數中可以指定一個參數,也可以指定兩個或多個參數。
3.2.2 析構函數
析構函數用于析構類的實例,它與構造函數不同,當對象脫離其作用域時(如對象所在的方法已經調用完畢),系統會自動執行析構函數中的代碼。析構函數往往用來做清理垃圾碎片的工作。開發者在使用析構函數時,需要注意以下幾點。
(1)一個類只能有一個析構函數。
(2)析構函數無法被繼承。
(3)析構函數被編譯器調用,開發者無法控制何時調用,由垃圾回收器決定。
(4)析構函數沒有訪問修飾符和參數。
(5)析構函數不能定義返回值類型,也不能定義返回值。
(6)程序退出時自動調用析構函數。
聲明析構函數時,其函數名稱必須是類名,只要在命名前使用“~”符號與構造函數進行區別。語法如下:
~類名(){ //銷毀實例語句 }
析構函數只能存在于類中,不能存在于結構中,析構函數沒有任何的修飾符,不能被顯式調用,沒有參數,也就意味著析構函數不能有重載。
【范例5】
在本范例中創建三個類,這三個類構成一個繼承鏈,First類是父類,Second類是從First類派生而來的,而Third類是從Second類派生而來的,它們都有析構函數,代碼如下。
class First { ~First() { Console.WriteLine("First's destructor is called."); } } class Second : First { ~Second() { Console.WriteLine("Second's destructor is called."); } } class Third : Second { public Third() { Console.WriteLine("hello,my dear"); } ~Third() { Console.WriteLine("Third's destructor is called."); } }
在Program.cs文件的Main()方法中,創建Third類的實例,代碼如下。
class Program { static void Main(string[] args) { Third t = new Third(); } }
運行Program.cs文件查看輸出結果,內容如下。
hello,my dear Third's destructor is called. Second's destructor is called First's destructor is called.
- Mastering JavaScript Functional Programming
- Node.js 10實戰
- Learning PostgreSQL
- WordPress 4.0 Site Blueprints(Second Edition)
- JavaCAPS基礎、應用與案例
- PySpark Cookbook
- 低代碼平臺開發實踐:基于React
- Microsoft Azure Storage Essentials
- OpenResty完全開發指南:構建百萬級別并發的Web應用
- R語言數據可視化:科技圖表繪制
- PHP與MySQL權威指南
- Python計算機視覺和自然語言處理
- HTML+CSS+JavaScript網頁制作:從入門到精通(第4版)
- WebStorm Essentials
- R的極客理想:量化投資篇