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

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

     編輯:關於C#

類別常有多個建構函式,維護所有建構函式中欄位初始化同步極易出錯。欄位初始化運算式(宣告時直接賦值)讓編譯器自動在所有建構函式前插入初始化碼,新增建構函式或欄位皆自動受惠,最簡單可靠。

基本用法

public class MyClass
{
    private ArrayList _coll = new ArrayList(); // 所有建構函式前自動執行
    public MyClass() { }
    public MyClass(int size) { _coll = new ArrayList(size); } // 覆寫預設值
}

三大避免使用情境

1. 初始化為零值/null — 多餘且低效

CLR 已在配置記憶體時將所有位元置零。額外寫 _field = null 或 _val = new ValType() 產生多餘 IL:

  • 參考型別:額外 ldnull; stfld 指令。
  • 實值型別:產生 initobj 指令,觸發裝箱/拆箱(參見原則 17),效能損失更大。

2. 建構函式中又重新指派 — 產生垃圾

private ArrayList _coll = new ArrayList(); // 預設配置
public MyClass(int size) { _coll = new ArrayList(size); } // 第二次配置,第一個成垃圾

解決:改用建構函式鏈結(原則 14),僅在最終建構函式配置。

3. 需捕獲初始化例外 — 初始化運算式無法 try/catch

欄位初始化運算式拋出的例外會直接冒泡至型別建構器外部,無法在類別內捕獲。需異常處理時,請移至建構函式(參見原則 45)。

執行順序

  • 實例欄位初始化運算式 先於 基類建構函式執行。
  • 依宣告順序依序執行。
  • 靜態欄位同理,先於靜態建構函式。

最佳實務

  • 簡單、固定、非零初始值 → 欄位初始化運算式。
  • 需依建構參數決定、或可能例外、或會被建構函式覆寫 → 建構函式中處理(配合建構函式鏈結)。
  • 零值/null → 完全依賴 CLR 自動置零,勿寫程式碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved