c# 構造函數執行順序

轉載自 http://blog.csdn.net/gshgsh1228/article/details/50867274函數

 

全部的類都至少包含一個構造函數。這些構造函數中可能有一個默認的構造函數,默認的構造函數沒有參數,與類同名。其它帶參數的構造函數稱爲非默認的構造函數。this

在類的外部不能用私有的構造函數實例化對象,經過把默認的構造函數設置爲私有,就能夠強制類的用戶使用非默認的構造函數。spa

一些類沒有公共的構造函數,外部代碼就不能實例化它。.net

靜態成員,也稱爲共享成員,能夠在類的實例之間共享。靜態成員經過類直接引用。對象

一個類只能有一個靜態的構造函數,該構造函數不能有訪問修飾符,也不能帶任何參數。靜態構造函數不能直接調用,只能在下述狀況下執行:blog

(1)建立包含靜態構造函數的類的實例時class

(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()

相關文章
相關標籤/搜索