為了方便內容的開展,我先說說一個對象的構造過程。
對於類型第一 個實例的構造過程大致如下:
1.分配靜態成員的內存空間,此時空間存 儲數據為0;
2.執行靜態成員的初始化語句;
3.執行基類的靜 態構造函數;
4.執行類型的靜態構造函數;
5.分配成員的內存 空間,此時空間存儲數據為0;
6.執行成員的初始化語句;
7. 執行相應的基類構造函數;
8.執行類型的構造函數。
那麼對於 同類型的後續創建對象,前4個步驟不用執行的,直接從第5步開始。
現 在來說說為什麼推薦使用成員初始化語句來初始化成員。由於成員初始化先於構 造函數的調用,所以更早初始化有利於使用;其次,避免對構造函數重復添加初 始化代碼,尤其是新增成員的時候,把初始化放到定義成員的位置,減少因構造 函數之間的不一致,而造成某些成員未被初始化。而且把成員初始化從構造函數 中抽出來,使代碼顯得更簡潔明朗。
例如:
public class MyList
{
//Init class member here
private ArrayList _List = new ArrayList();
}
是不是所有的成 員都可以這樣進行初始化呢。事實上,有三種場景是不適合用這樣的方式來完成 成員初始化。
第一種就是給成員賦給“0”或者 “null”,這並不是錯誤語句,而是沒有必要的。參看前面的對象構 造過程,由於成員首先會被分配內存空間,並且同時已經用“0”進 行初始化了。因此顯式的賦值會增加指令操作,而影響效率。
第二種就 是根據不同參數來指明成員初始化的方式,而一般類似操作是放在構造函數中。如果使用成員初始化語句的話,那麼在構造函數中重新初始化成員,就會生成一 個短暫的臨時對象。
例如:
public class MyList
{
//Init class member here
private ArrayList _List = new ArrayList();
public MyList()
{}
public MyList( int nSize )
{
_List = new ArrayList( nSize );
}
}