c# 構造函數執行順序


轉載自 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM