[讀書筆記 ]Stephens' C# Programming with Visual Studio 2010 24-Hour Trainer 第二十四章

  • 1675
  • 0

閱讀Stephens' C#教材第二十四章筆記

 

Chapter 24 Initializing Objects.
 
本章將介紹如何初始化所建立的物件。可參考微軟網頁
 
物件建立除了透過new關鍵字,還需要對於類別定義的屬性給予初始值物件才能正常運作,給予初始值的方式有幾種。
 
以Employee類別為例,建立一個名為Bob的實體物件,初始化的程式如下:
            Employee bob = new Employee()
            {
                FirstName = "Bob",
                LastName = "Baker",
                Street = "200 Beach Blvd",
                City = "Bugsville",
                State = "CO",
                Zip = "82010",
                EmployeeId = 1002,
                MailStop = "B-2"
            };
 
在C#語言中建構子(constructor)是當物件被建立時固定會執行的一個方法,由於建構子的執行時間是在物件被使用之前,所以可以利用建構子作為連線資料庫、預備資料結構或是初始化屬性的時機點。
 
建構子可概分為無參數建構子與有參數建構子。
無參數建構子,顧名思義就是不需要傳入參數的建構子,例如以下程式中的Manager類別,當中有一個Manager的建構子(建構子一定與類別同名)。
如果在類別中沒有任何建構子,C#會自動產生一個建構子,如下程式:
    class Manager : Person
    {
        public Manager()
        {
        }
    }
 
但是如果你在Manager類別撰寫了任何建構子(無論有無參數,則C#就不會再自動產生上述的建構子)
 
下面程式,以Person類別為例,有三個建構子,第一個是無參數建構子,後面兩個是有參數建構子。
    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }

        // Parameterless constructor.
        public Person()
        {
            // General initialization if needed ...
        }

        // Initialize first and last name.
        public Person(string firstName, string lastName)
            : this()
        {
            FirstName = firstName;
            LastName = lastName;
        }

        // Initialize all values.
        public Person(string firstName, string lastName, string street,
            string city, string state, string zip) 
            : this(firstName, lastName)
        {
            Street = street;
            City = city;
            State = state;
            Zip = zip;
        }
    }
 
解構子(destructor)是相對於建構子,當一個物件被建立,會自動執行建構子,當一個物件被消滅時則系統會自動執行解構子。
解構子的主要功能可能是關閉資料庫連線、關閉開啟的檔案、釋放記憶體資源以及其他此物件運行時有關連的資源。
 
相對建構子而言,解構子比較簡單,理由如下:
  1. 一個類別只有一個解構子
  2. 你不用直接呼叫解構子,解構子只能被系統自動呼叫
  3. 解構子不會包含其他解構子
  4. 解構子不會有參數
 
解構子範例程式如下:
    ~Person
    {
          // Perform cleanup chores here...
    }
 
解構子會配合C#的垃圾收集(garbage collector)機制自動執行,所以並不之何時會被呼叫,如果記憶體使用非常充裕,可能一直到程式結束才會被呼叫,所以如果要強制物件將使用資源回收,可以使用Dispose方法。
 
如果怕有時會忘記呼叫Dispose方法,可以在物件一開始時使用using陳述式,這個陳述式會在區段結束時自動呼叫Dispose方法。
 
using的參考語法如下:
    using (variableIninialization)
    {
          ...Statement...
    }
由於建構子可以建很多個,每個建構子都有不同數目的參數,但是可能這些建構子會重複執行同樣的程序,例如初始的屬性中都有FirstName, LastName,在C#中可以在建構子中包含其他建構子,以簡化重複初始化的情形。
 
C#使用this關鍵字在建構子中表示對在建構的物件本身的參考。
例如上面Person類別為例的程式,第一個建構子是無參數建構子。第二個建構子使用this關鍵字(沒有參數)呼叫第一個建構子,然後在初始化兩個屬性。第三個建構子使用this關鍵字並傳入兩個參數,於是會呼叫第二個建構子,然後再初始化三個屬性(可參考Employees示範)。
 
本章的Try It示範的就是以Person類別為主,產生Employee及Manager的程式撰寫,程式可以根據不同數量的參數產生對應的物件,並自動初始化,但是畫面上沒有操作過程。