建構函式的執行順序

2021-06-18 01:56:27 字數 2943 閱讀 4541

任何建構函式都可以進行配置,以便在執行自己的**前呼叫其它建構函式。

我們首先看看在建立類的例項時會發生什麼情況。為了例項化派生的類,必須例項化它的基類。而要例項化這個基類,又必須例項化這個基類的基類,這樣一直例項化到system.object為止。結果是無論使用什麼建構函式例項化乙個類,總是要先呼叫system.object.object()。

如果對乙個類使用非預設的建構函式,預設的情況是在其基類上使用匹配於這個建構函式簽名的建構函式。如果沒有找到這樣的建構函式,就使用基類的預設建構函式(根類system.object總是要使用預設的建構函式,因為這個類沒有非預設的建構函式)。

我們以下面這個小**段例子作一些說明:

public  class mybaseclass

publicmybaseclass(int i)

}public class myderivedclass : mybaseclass

publicmyderivedclass(int i)

publicmyderivedclass(int i,intj)

}

如果以下面的方式例項化myderivedclass:

myderivedclass myobj =

newmyderivedclass();

則發生下面的一系列事件:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass()建構函式。

3.執行myderivedclass.myderivedclass()建構函式。

如果使用下面的語句:

myderivedclassmyobj =

newmyderivedclass(4);

則發生下面的—系列事件:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(inti)建構函式。

如果使用下面的語句:

myderivedclassmyobj =

newmyderivedclass(4,8);

則發生下面的—系列事件:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass()建構函式。

3.執行myderivedclass.myderivedclass(inti, int j)建構函式。

有時需要對發生的事件進行更多的控制。例如,在上面的例項化範例中,需要有下面的事件序列:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(inti, int j)建構函式。

使用這個序列可以在編寫mybaseclass(int i)中使用inti引數的**,即myderivedclass(int i, int j)建構函式要做的工作比較少,只需要處理int j引數(假定int i引數在兩種情況下有相同的含義)。我們僅需指定在派生類的建構函式定義中所使用的基類的建構函式,如下所示:

public

class myderivedclass :mybaseclass

}其中,base關鍵字指定.net例項化過程,以使用基類中匹配指定簽名的建構函式。這個例子中使用乙個int引數,所以在例項化序列中應呼叫mybaseclass(int i)。

同時我們也可以使用這個關鍵字指定基類建構函式的字面值。

public

class myderivedclass :mybaseclass……}

這段**將執行以下序列:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass(inti)建構函式。

3.執行myderivedclass.myderivedclass()建構函式。

下面我們介紹另乙個關鍵字this。這個關鍵字指定在呼叫指定的建構函式前,.net例項化過程對當前類使用非預設的建構函式。

public

class myderivedclass :mybaseclass

……publicmyderivedclass(int i,intj) :base(i)

}這段**將執行以下序列:

1.執行system.object.object()建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(inti,int j)建構函式。

4.執行myderivedclass.myderivedclass()建構函式。

唯一的限制是使用

this

或base

關鍵字只能指定乙個建構函式。但是如上所示,這並不是乙個很嚴厲的限制,按照上述方式仍可以構造相當複雜的執行序列。

1.為什麼使用靜態建構函式?

類有一些靜態欄位和屬性,需要在第一次使用類之前,從外部源中初始化這些靜態欄位和屬性

2.靜態建構函式什麼時候執行?

clr不能確定靜態建構函式什麼時候執行,也不能預計不同類的靜態建構函式按什麼順序執行,但可以明確的是,靜態建構函式之多執行一次,即在引用類之前執行

在c#中,靜態建構函式通常在第一次呼叫類的成員之前執行

3.靜態建構函式有訪問修飾符嗎?

沒有。因為,c#**從不呼叫它,但在載入類時,總是由,clr呼叫它。對於c#來說是私有的吧

4.靜態建構函式可以有引數嗎?

不能有引數。

5.乙個類可以有多個靜態建構函式嗎?

乙個類只能有乙個靜態建構函式

6.靜態建構函式可以訪問例項成員嗎?

顯然不能。只能訪問靜態成員

建構函式的執行順序

1 using system 2 using system.collections.generic 3 using system.linq 4 using system.text 5 6 namespace 例項構造器13 14 public string b bjq 15 16 public a ...

PHP建構函式的執行順序

php建構函式的執行順序 測試 如下 class grandfather class father extends grandfather class son extends father test new son 結果是 son class grandfather class father ext...

C 建構函式的執行順序

類的大小 1 一般情況下,類的大小是類裡資料成員大小之和,普通函式不佔空間 2 static不佔空間大小 3 virtual虛函式,如果有虛函式,則多乙個vptr 虛指標 不管有多少虛函式,都只有乙個虛指標,指標佔4個位元組大小。4 空類佔乙個位元組大小。建構函式的執行順序 class test t...