C 物件初始化的順序分析

2021-06-28 07:51:40 字數 1122 閱讀 9260

先變數後建構函式,變數先被初始化,然後建構函式被執行。

先靜態後例項化,當乙個類輩訪問時,靜態變數和建構函式最先被初始化,接著是物件的例項化變數和建構函式被初始化。

先子類後父類,也可以理解問先派生類後基類,對於變數和靜態建構函式,派生物件在基物件之前被初始化,比如c類派生自b類,

b類派生自a類,那麼變數和靜態建構函式被初始化的次序是c-b-a.

除了例項建構函式。對於例項建構函式,基類建構函式在派生類建構函式之前被執行,例項建構函式被執行次序是a-b-c.

如果類裡面有成員類,成員類的建構函式優先被呼叫

建立派生的物件,基類的建構函式優先被呼叫(也優先於派生類裡的成員類)

基類建構函式如果有多個基類,則建構函式的呼叫順序是某類在派生類表中出現的順序而不是它們在成員初始化表中的順序

成員類物件建構函式如果有多個成員類物件,則建構函式的呼叫順序是物件在類中被生母的順序而不是他們出現在成員初始化表中的順序

派生類建構函式,作為一般規則派生類建構函式應該不能直接向乙個基類資料成員賦值而是把值傳遞給適當的基類建構函式,

否則兩個類的實現變成緊耦合(tightly coupled)將更加難於正確地修改或擴充套件基類的實現(基類設計者的責任是提供一組適當的基類建構函式)

參照文章:追夢流星部落格,文章c#物件初始化順序

class program

class father

",staticstr);

staticstr = "靜態字串在父類中改變";

print();

}public virtual void print()

}class son : father

public override void print()

,,,",staticstr,fatherstr,sonstr,changestr);}}

}}

程式執行順序如下圖所示:12345678910

c 物件初始化順序

c 物件初始化 1.先變數後建構函式。變數先被初始化 然後建構函式被執行 2.先靜態化後例項化。當乙個類被訪問時 靜態變數和建構函式最先被初始化 接著是物件的例項化變數和建構函式被初始化 3.先派生類後基類。對於變數和靜態建構函式 派生物件在基物件之前被初始化.比如 c類派生自b類 b類派生自a類 ...

C 物件的初始化順序

當構造乙個c 物件時,理解物件的字段和建構函式的順序是非常重要的 derived static fields 派生類靜態字段 derived static constructor 派生來靜態建構函式 derived instance fields 派生類例項字段 base static fields...

物件的初始化順序

由 static 關鍵字修飾的 如 類變數 靜態變數 靜態 塊 將在類被初始化建立例項物件之前被初始化,而且是按順序從上到下依次被執行 沒有 static 關鍵字修飾的 如 例項變數 非靜態變數 非靜態 塊 初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的 塊優先執行到,其也是按順...