閱讀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)是相對於建構子,當一個物件被建立,會自動執行建構子,當一個物件被消滅時則系統會自動執行解構子。
解構子的主要功能可能是關閉資料庫連線、關閉開啟的檔案、釋放記憶體資源以及其他此物件運行時有關連的資源。
相對建構子而言,解構子比較簡單,理由如下:
- 一個類別只有一個解構子
- 你不用直接呼叫解構子,解構子只能被系統自動呼叫
- 解構子不會包含其他解構子
- 解構子不會有參數
解構子範例程式如下:
~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的程式撰寫,程式可以根據不同數量的參數產生對應的物件,並自動初始化,但是畫面上沒有操作過程。