Effective C# Item14:利用構造器鏈

來源:互聯網
上載者:User

    編寫建構函式通常是一件重複性的勞動,我們經常需要在不同聲明形式的建構函式中,對同一個成員變數進行同樣的初始化操作,為了完成這個任務,通常有以下三種方式。

  1. 對代碼採用“複製/粘貼”的方式,在寫好一個建構函式後,將代碼粘貼到其他建構函式中。
  2. 採用輔助函數的方式,將共通的邏輯放置到一個單獨的方法中,然後在每個建構函式中調用這個方法。
  3. 採用構造器鏈的方式,在一個建構函式中,使用另外的建構函式。

    首先,我們要拋棄上述第1種方案,因為重複代碼是一種非常明顯的代碼“壞味道”;對於第2種方案,從消除重複代碼的角度來看,是沒有問題的,但是產生的目標代碼的效率比較低,編譯器會在每個建構函式上添加一些代碼來執行我們所需要的函數邏輯,它會為每個成員變數添加變數初始化器,並且會調用基類的構造器;而第3種方案,是最簡單、最有效率的方式。

    我們可以這樣使用構造器鏈。

代碼

 1 public class MyClass
2 {
3 // collection of data
4 private ArrayList _coll;
5 // Name of the instance:
6 private string _name;
7
8 public MyClass() :
9 this( 0, "" )
10 {
11 }
12
13 public MyClass( int initialCount ) :
14 this( initialCount, "" )
15 {
16 }
17
18 public MyClass( int initialCount, string name )
19 {
20 _coll = ( initialCount > 0 ) ?
21 new ArrayList( initialCount ) :
22 new ArrayList();
23 _name = name;
24 }
25 }

    對於C#對象初始化過程中每一步的順序,如下。

  1. 將所有的靜態變數設定為0
  2. 執行靜態變數初始化器
  3. 執行基類的靜態建構函式
  4. 執行當前類型的的靜態建構函式
  5. 將所有執行個體變數設定為0
  6. 執行執行個體變數初始化器
  7. 執行合適的基類執行個體建構函式
  8. 執行當前類型的樣本建構函式

    當建立一個對象時,C#編譯器會確保其中的所有變數以某種方式被正確的初始化。至少,我們可以確保建立對象執行個體時,其所有的記憶體都設定為0。靜態成員和執行個體成員都遵循這一規則。但我們的目標是確保將所有的變數按照我們期望的方式進行初始化,並且只初始化一次。

    我們應該使用變數初始化器來初始化簡單的資源。如果需要複雜的邏輯,我們就需要使用建構函式來執行初始化,但這時候我們最好將一些共用的邏輯放在一些建構函式中,然後使用建構函式初始化器來調用它們,從而將代碼重複降到最低。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.