首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Effective C# 原則 14:善用建構函式鏈結

     編輯:關於C#

撰寫多載建構函式時,切勿複製貼上或抽取私有輔助方法。C# 提供建構函式初始化運算式(this(...) / base(...)),讓一個建構函式委派另一個,避免程式碼重複,且編譯器會最佳化:移除重複欄位初始化與基類建構呼叫,產生最高效 IL。

建構函式鏈結範例

public class MyClass
{
    private ArrayList _coll;
    private string _name;

    public MyClass() : this(0, "") { }
    public MyClass(int initialCount) : this(initialCount, "") { }
    public MyClass(int initialCount, string name)
    {
        _coll = (initialCount > 0) ? new ArrayList(initialCount) : new ArrayList();
        _name = name;
    }
}

為何優於輔助方法?

輔助方法版本:

public MyClass() { CommonConstructor(0, ""); }
public MyClass(int count) { CommonConstructor(count, ""); }
private void CommonConstructor(int count, string name) { ... }

編譯器會在每個建構函式插入:欄位預設初始化(置零)、基類建構呼叫、再呼叫輔助方法。建構函式鏈結版本:只有最完整的建構函式執行欄位初始化與基類呼叫,其餘僅委派,零重複指令。

唯讀欄位強制要求

readonly 欄位只能在建構函式中指派。輔助方法無法指派 readonly 欄位(編譯錯誤),建構函式鏈結則完全支援。

物件建構完整順序

  1. 靜態欄位置零
  2. 靜態欄位初始化運算式
  3. 基類靜態建構函式
  4. 本類靜態建構函式
  5. 實例欄位置零
  6. 實例欄位初始化運算式
  7. 基類實例建構函式(由初始化運算式決定)
  8. 本類實例建構函式本體

後續實例從第 5 步開始。第 6、7 步經編譯器最佳化(建構函式鏈結時移除重複)。

最佳實務

  • 簡單欄位用欄位初始化運算式(宣告處直接賦值)。
  • 複雜邏輯用建構函式。
  • 多載建構函式盡量委派最完整者(this(...)),避免重複程式碼與 IL 指令。
  • 確保每個欄位精確初始化一次,越早完成越好。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved