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

Effective C# 原則 12:優先使用欄位初始化器而非建構函式賦值

     編輯:關於C語言

欄位初始化器語法

public class MyClass
{
    // 宣告同時初始化
    private readonly List _items = new List();
    private readonly Dictionary _map = new Dictionary();
    private const int DefaultCapacity = 100;
}

優勢

  1. 零遺漏:無論增加多少建構函式,欄位必被初始化
  2. 單一真實來源:初始化邏輯集中在宣告處,易維護
  3. 建構函式簡潔:無需重複賦值碼
  4. 執行順序明確:依宣告順序,在基類建構函式之前執行

兩種避免初始化器的情況

1. 初始化為預設值(0/null)

// ❌ 多餘:CLR 已保證零初始化
private int _count = 0;
private string _name = null;
private MyStruct _val = new MyStruct(); // 結構更糟:產生 initobj + 裝箱/拆箱

// ✅ 正確:直接宣告
private int _count;
private string _name;
private MyStruct _val;

2. 建構函式需不同初始值

// ❌ 重複初始化:初始化器跑一次,建構函式又蓋一次
public class MyClass
{
    private List _items = new List();
    public MyClass() { }
    public MyClass(int capacity) { _items = new List(capacity); }
}

// ✅ 正確:移除初始化器,建構函式統一處理
public class MyClass
{
    private readonly List _items;
    public MyClass() : this(0) { }
    public MyClass(int capacity) => _items = new List(capacity);
}

靜態欄位同樣適用

public static readonly Regex EmailPattern = new Regex(@"^[\w.]+@[\w.]+\.\w+$");
public static readonly Dictionary Cache = new Dictionary();

執行順序細節

  1. 靜態欄位初始化器(依宣告順序)
  2. 靜態建構函式
  3. 執行個體欄位初始化器(依宣告順序)
  4. 基類建構函式
  5. 衍生類建構函式本體

總結

預設使用欄位初始化器。例外:初始化為預設值(零初始化已足夠)、建構函式需不同參數初始化。靜態欄位同樣受益。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved