程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#類的成員初始化順序(2)

C#類的成員初始化順序(2)

編輯:關於C語言

程序動行的結果是:

繼承類靜態成員DriveB_b初始化

繼承類實例變量DriveB_c初始化

基類靜態成員初始化

基類實例變量BaseA_c初始化

基類構造方法被調用

繼承類構造方法被調用

得出初始化順序結論:

1)繼承類靜態成員變量初始化

2)繼承類實例變量初始化

3)基類靜態靜態成員變量初始化

4)基類實例變量初始化

5)基類構造方法調用

6)繼承類構造方法調用。

好像結果和JAVA的有點不一樣啊, 有點混亂的感覺,搞不懂M$為什麼要讓初始化按這樣的順序執行,像Java那樣嚴格的從基類到派生類多好呀.上例的運行結果說明, 構造函數這麼這個和我們通常思路執行的順序還是有一定的差別.對於實例成員初始化,基本上就是以下步驟執行:

1 類的對象初始化大體順序上實例成員賦值到構造函數

2 成員賦值初始化按照由子類到父類的順序

3 構造函數的初始化按照由父類到子類的順序

從這裡我們有一點需要注意的是,因為成員賦值初始化是從子類到父類的,所以在子類的成員賦值初始化的過程中,不要引用父類定義的成員,因為這個時候父類成員還沒有開始初始化.需要說明一點的是C#在創建對象的第一步分配內存完成後會動把所有實例成員變量初始化成變量的默認值,例如整型就是0,引用類型就是null.然後才開始進行成員變量初始化的過程.C#並沒有提供類似於C++構造函數中成員特殊的初始化方式:

public constructor(int a)i_a(a){}

估計是因為分配內存和初始化的嚴格分離,以及反射創建對象的需要,而且也不像C++那樣追求的是extreme效率的原因吧;而且就像是以前看到有人說過,再好的語法級別的優化都不能改變寫得爛的代碼帶來的效率低下.

我們知道,C#裡面的靜態成員初始化不同於C++的靜態成員初始化.C#裡的靜態成員只會在必要的時候,確切的說是在第一次訪問該類的時候才會進行靜態成員的初始化.這樣做也是有一定道理的,一是減少了內存的開銷,再就是加快了程序集啟動的時間,很難想像多一個比較費時的靜態初始化在程序啟動的時候就一一進行,那樣的等待會是比較痛苦的.而且大部分時間我們都只是使用一個程序集裡面很少的一部分類,如果把程序集裡面所有的類不管三七二十一都預先進行初始化的話,對內存和時間的浪廢還是比較大的.

了解了靜態成員初始化的時機,就引出了另外一個問題,如果兩個類相互間引用,比如A類的靜態初始化裡引用到了B類,B類的靜態

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved