建構函式和解構函式
本節說明對象的建立、初始化和銷毀過程。本節介紹下列主題:
l 類建構函式
l 結構建構函式
l 解構函式
類建構函式
本節將討論三種類建構函式:
類建構函式的類型 |
注釋 |
執行個體 |
用於建立並初始化類的執行個體。 |
私人 |
在類之外不可訪問的特殊類型執行個體建構函式。無法用私人建構函式來執行個體化類。 |
靜態 |
在建立第一個執行個體或引用任何靜態成員之前,將自動調用這種建構函式來初始化類。無法直接調用這種建構函式。 |
備忘
(1) 執行個體建構函式
建立新對象時將調用類建構函式,例如:
Point myPoint = new Point();
一個類可以有多個建構函式。例如,可以聲明一個不帶參數的建構函式(如 Point())和一個帶參數的建構函式(如 Point(int x, int y))。
如果類沒有建構函式,將自動產生一個預設的無參數建構函式,並使用預設值初始化對象欄位(例如,int 將初始化為 0)。
類建構函式可通過base關鍵字來調用基類的建構函式,例如:
public Cylinder(double radius, double height): base(radius, height)
{
}
類建構函式也可通過關鍵字 this 調用同一個類的另一個建構函式,例如:
public Point(): this(0,20)
{
}
在前面的樣本中,無參數建構函式 Point() 調用了另一個帶有兩個參數的建構函式,將預設位置初始化為 (0, 20)。
(2)私人建構函式
私人建構函式是一種特殊的執行個體建構函式。它通常用在只包含靜態成員的類中。如果類具有一個或多個私人建構函式而沒有公用建構函式,則不允許其他類(除了嵌套類)建立該類的執行個體。例如:
class NLog
{
// Private Constructor:
private NLog() {}
public static double e = 2.71828;
}
聲明空建構函式可阻止自動產生預設建構函式。注意,如果您不對建構函式使用存取修飾詞,則在預設情況下它仍為私人建構函式。但是,通常顯式地使用 private(私人)修飾符來清楚地表明該類不能被執行個體化。
(3)靜態建構函式
靜態建構函式用於初始化類。在建立第一個執行個體或引用任何靜態成員之前,將自動調用靜態建構函式來初始化類。
靜態建構函式既沒有存取修飾詞,也沒有參數。
在建立第一個執行個體或引用任何靜態成員之前(方法或欄位),將自動調用靜態建構函式來初始化類。
無法直接調用靜態建構函式。靜態建構函式也不能訪問非靜態成員,它只被調用一次
在程式中,使用者無法控制何時執行靜態建構函式。
靜態建構函式的典型用途是:當類使用記錄檔時,將使用這種建構函式向記錄檔中寫入項。
結構建構函式
結構建構函式類似於類建構函式,只是存在以下差異:
n 結構不能包含顯式的無參數建構函式。結構成員將自動初始化為它們的預設值。
n 結構不能有以下形式的初始值設定項:base (argument-list)。
結構可以聲明建構函式,但它們必須帶參數。聲明結構的預設(無參數)建構函式是錯誤的。結構成員不能有初始值設定項。總是提供預設建構函式以將結構成員初始化為它們的預設值。
對於結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承。結構不能有以下形式的初始值設定項:base (argument-list)。
解構函式
解構函式用於銷毀類的執行個體。
備忘
不能對結構使用解構函式。只能對類使用解構函式。
一個類只能有一個解構函式。
無法繼承或重載解構函式。
無法調用解構函式。它們是被自動調用的。
解構函式既沒有修飾符,也沒有參數。例如,下面是類 MyClass 的解構函式的聲明:
~ MyClass()
{
// Cleanup statements.
}
該解構函式隱式地對對象的基類調用 Object.Finalize 方法。這樣,前面的解構函式代碼被隱式地轉換為:
protected override void Finalize()
{
try
{
// Cleanup statements.
}
finally
{
base.Finalize();
}
}
這意味著對繼承鏈中的所有執行個體遞迴地(從派生相近程度最大的到派生相近程度最小的)調用 Finalize 方法。
程式員無法控制何時調用解構函式,因為這由記憶體回收行程決定的。記憶體回收行程檢查是否存在應用程式不再使用的對象。它認為這些對象符合銷毀條件並回收這些對象佔用的記憶體。程式退出時也會調用解構函式。
base關鍵字
base 關鍵字用於從衍生類別中訪問基類的成員:
調用基類上已被其他方法重寫或隱藏的方法。
指定建立衍生類別執行個體時應調用的基類建構函式。
基類訪問只能在建構函式、執行個體方法或執行個體屬性訪問器中進行。
靜態方法中使用 base 關鍵字是錯誤的。
This 關鍵字
this 關鍵字表示類的當前執行個體。
靜態成員沒有 this 指標。
訪問被相同的名稱隱藏的成員。
如:
public Employee(string name, string alias)
{
this.name = name;
this.alias = alias;
}
將this作為參數傳遞到其他方法。
如:
CalcTax(this);
聲明索引器,例如:
public int this [int param]
{
get
{
return array[param];
}
set
{
array[param] = value;
}
}
調用同類中其它的建構函式
靜態方法、靜態屬性訪問器引用 this 是錯誤的。