本節說明對象的創建、初始化和銷毀過程。本節介紹下列主題:
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)。
析構函數
析構函數用於銷毀類的實例。
備注
不能對結構使用析構函數。只能對類使用析構函數。
一個類只能有一個析構函