轉載自 http://blog.csdn.net/gshgsh1228/article/details/50867274
所有的類都至少包含一個構造函數。這些構造函數中可能有一個默認的構造函數,默認的構造函數沒有參數,與類同名。其它帶參數的構造函數稱為非默認的構造函數。
在類的外部不能用私有的構造函數實例化對象,通過把默認的構造函數設置為私有,就可以強制類的用戶使用非默認的構造函數。
一些類沒有公共的構造函數,外部代碼就不能實例化它。
靜態成員,也稱為共享成員,可以在類的實例之間共享。靜態成員通過類直接引用。
一個類只能有一個靜態的構造函數,該構造函數不能有訪問修飾符,也不能帶任何參數。靜態構造函數不能直接調用,只能在下述情況下執行:
(1)創建包含靜態構造函數的類的實例時
(2)訪問包含靜態構造函數的類的靜態成員時
非靜態構造函數也稱實例構造函數。
靜態類只包含靜態成員,且不能用於實例化對象(如Console)。
任何構造函數都可以配置為在執行自己的代碼前調用其他構造函數。
創建類的實例時,會調用類的構造函數,為了實例化派生的類,必須實例化它的基類;要實例化這個基類,有必須實例化這個基類的基類,這樣一直實例化System.Object(所有類的根),因此無論使用什么構造函數實例化一個類,總是首先調用System.Object.Object().
下面用例子說明構造函數的執行順序:
publicclass MyBaseClass
{
Public MyBaseClass()
{
}
Public MyBaseClass(int i)
{
}
}
publicclass MyDerivedClass:MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i,int j)
{
}
}
使用下面語句實例化MyDerivedClass
MyDerivedClass myObj=new MyDerivedClass();
構造函數執行順序如下:
(1)執行System.Object.Object()
(2)執行MyBaseClass.MyBaseClass()
(3)執行MyDerivedClass.MyDerivedClass()
另外,使用下面語句實例化MyDerivedClass
MyDerivedClass myObj=newMyDerivedClass(4,8);
構造函數執行順序如下:
(1)執行System.Object.Object()
(2)執行MyBaseClass.MyBaseClass()
(3)執行MyDerivedClass.MyDerivedClass(int i,int j)
如果我們想要得到下面的執行順序:
(1)執行System.Object.Object()
(2)執行MyBaseClass.MyBaseClass(inti)
(3)執行MyDerivedClass.MyDerivedClass(int i,int j)
可以使用base關鍵字指定.NET實例化過程中使用基類中具有指定參數的構造函數,即:
publicclass MyDerivedClass:MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i,int j):base(i)
{
}
}
這樣將不會調用MyBaseClass.MyBaseClass()
除base關鍵字外,關鍵字this也可指定構造函數初始化器。這個關鍵字指定在調用指定的構造函數前,.NET實例化過程對當前類使用非默認的構造函數。
例如:
publicclass MyDerivedClass:MyBaseClass
{
publicMyDerivedClass():this(5,6)
{
}
public MyDerivedClass(int i)
{
}
publicMyDerivedClass(int i,int j):base(i)
{
}
}
使用MyDerivedClass. MyDerivedClass()構造類,將執行下列序列:
(1)執行System.Object.Object()
(2)執行MyBaseClass.MyBaseClass(inti)
(3)執行MyDerivedClass.MyDerivedClass(int i,int j)
(4)執行MyDerivedClass.MyDerivedClass()