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

《Effective C#》:使用成員初始化語句

編輯:關於C#

為了方便內容的開展,我先說說一個對象的構造過程。

對於類型第一 個實例的構造過程大致如下:

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 );
 }
}

以上例子,如果通過“MyList( int nSize ) ”這個構造函數來創建對象,會先通過成員初始化來初始 “_List”成員,然後在構造函數重新初始化此成員。那麼實際上,會在內存中產生兩個ArrayList對象,前一個已經成為垃圾,需要等待GC進行回 收。對於這種情況,用如下的方式可能會更好。

public class MyList
{
 //Init class member here
 private ArrayList _List;
 public MyList()
 {
  _List = new ArrayList ();
 }
 public MyList( int nCount )
 {
   _List = new ArrayList( nCount );
 }
}

對於最後 一種就是,由於通過成員初始化來初始化成員,在初始化語句地方是不能加入 try-catch來捕獲異常,因此在初始化過程中所出現的異常會被傳遞出去,為了保證程序的安全,則需要在調用端進行try-catch捕獲。不過這樣操作會使調用 端的代碼顯得繁瑣,更合理的做法,是在類型中對成員初始化進行異常處理,因 此采用構造函數來初始化成員效果更好些。例如:

public class MyTest
{
 private TempObject _value;
 public MyTest ()
 {
  try
  {
   _value = new TempObject();
  }
  catch( Exception err )
  {
    //Handle exception here
  }
 }
}

對於成員初始化的好處以及其的使用限制,到此就已經說完了。不過,我個人更喜歡通過構造函數來初始化成員。對於文章中所說到的,使用構 造函數來初始化成員的一些不利之處,例如:多個構造函數之間初始化操作的繁 瑣或者成員初始化的不統一,我覺得可以通過構造函數調用構造函數的方式來減 少此類問題。不過這也只是我個人看法,至於具體用什麼並沒規定。

返回教程目錄

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