C# 入門指南 - 建構子

C# 中建立物件 (object) 需要建構子 (constructor) ,如果類別 (class) 沒有定義建構子,編譯器 (compiler) 就會提供一個預設的建構子 (default constructor)




我們現在要來詳細討論建構子的作用與功能,建構子的主要目的在於建立物件的過程中,也就是使用 new 關鍵字 (keyword) 的時候,程式 (program) 所執行的工作,這些工作通常就是設定物件的屬性 (property) 。


如果類別沒有定義建構子,編譯器會提供預設預購子,預設建構子為沒有參數 (parameter) 的版本
public Encrypt() {}


建構子可以依需求而有不同的參數版本,例如, Encrypt 中我們需要以下屬性
string cArray;


我們之前用 setArray() 建立 cArray ,此時,可以直接將 setArray() 更改為建構子
public Encrypt() {
    System.Random r = new System.Random();
    int a = 0;
    int b = 0;
    // 限定 a 為偶數
    while (a % 2 == 0) {
        a = r.Next(1, 10);
        b = r.Next(1, 10);
    }
    System.Console.Write("a: " + a + ", b: " + b + ", "); 
            
    int x, y, m;
    char c = 'a';
    int i;
    System.Text.StringBuilder s = new System.Text.StringBuilder();
    for (i = 0; i < 26; i++) {
        x = c;
        y = x * a + b;
        m = y % 26;
        s.Append((char) (m + 97)); 
        c++; 
    }
    
    this.cArray = s.ToString();   
}


建構子是一種特別的方法 (method) ,沒有回傳值 (return value) ,因為建構子就是用來建立類別的物件。也可以像方法一樣有不同的參數版本,不過這裡我們採用沒有參數版本的建構子就可以了。


完整的 Encrypt 如下
class Encrypt {
    string cArray;
        
    public Encrypt() {
        System.Random r = new System.Random();
        int a = 0;
        int b = 0;
        // 限定 a 為偶數
        while (a % 2 == 0) {
            a = r.Next(1, 10);
            b = r.Next(1, 10);
        }
        System.Console.Write("a: " + a + ", b: " + b + ", "); 
            
        int x, y, m;
        char c = 'a';
        int i;
        System.Text.StringBuilder s = new System.Text.StringBuilder();
        for (i = 0; i < 26; i++) {
            x = c;
            y = x * a + b;
            m = y % 26;
            s.Append((char) (m + 97)); 
            c++; 
        }
    
        this.cArray = s.ToString();   
    }
    
    static void Main() {
        Encrypt e = new Encrypt();
        System.Console.WriteLine("e: "+ e.cArray);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:encrypt.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


編譯結果如下



這裡,我們在 Main() 中直接用句點運算子存取屬性 cArray ,其實不一個好習慣,因為如此物件的資料就曝光在世人面前,任何人都可以透過句點運算子存取,甚至更改屬性值,造成難以彌補的後果,從而失去資訊隱藏 (information hiding) 的意義。


因此,我們應該將屬性設成 private ,然後以 set 與 get 進行操作哩!


中英文術語對照
物件object
建構子constructor
類別class
編譯器compiler
建構子default constructor
關鍵字keyword
程式program
屬性property
參數parameter
方法method
回傳值return value
資訊隱藏information hiding


您可以繼續參考
軟體開發


相關目錄
回 C# 入門指南
回 C# 教材
回首頁


參考資料
http://msdn.microsoft.com/zh-tw/library/ms173109%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/x9afc042.aspx
http://msdn.microsoft.com/zh-tw/library/ms229036%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/0b0thckt.aspx
http://msdn.microsoft.com/zh-tw/library/ace5hbzh%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/ms173115%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/k6sa6h87%28v=vs.80%29.aspx

沒有留言: