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

C# 3.0 自動實作屬性與物件初始化器:減少樣板程式碼的雙重利器

     編輯:關於C#

C# 3.0 引入自動實作屬性與物件初始化器,兩大特性結合讓資料類別定義與實例化大幅精簡,消除了大量欄位宣告、屬性存取器與建構函式多載的樣板程式碼。

自動實作屬性

傳統寫法(C# 2.0)


public class Employee
{
    private int _id;
    private string _name;
    private string _sex;
    private int _age;
    private string _birthDate;

    public int Id { get { return _id; } set { _id = value; } }
    public string Name { get { return _name; } set { _name = value; } }
    public string Sex { get { return _sex; } set { _sex = value; } }
    public int Age { get { return _age; } set { _age = value; } }
    public string BirthDate { get { return _birthDate; } set { _birthDate = value; } }
}

C# 3.0 自動實作屬性


public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }
    public int Age { get; set; }
    public string BirthDate { get; set; }
}

編譯器生成: 為每個自動屬性產生隱私備份欄位(命名如 <Id>k__BackingField)與標準 get/set 存取子。IL 代碼體積與手寫版本相近,但原始碼減少 2/3 以上。

進階:單向存取與預設值(C# 6.0+)


// 唯讀自動屬性(僅 get,建構函式或初始化器設定)
public string Id { get; }

// 含預設值初始化(C# 6.0)
public int Age { get; set; } = 18;

物件初始化器

傳統初始化


Employee emp = new Employee();
emp.Id = 1;
emp.Name = "藍之風";
emp.Age = 24;
emp.BirthDate = "1984-10-21";
emp.Sex = "男";

C# 3.0 物件初始化器


Employee emp = new Employee 
{ 
    Id = 1, 
    Name = "藍之風", 
    Age = 24, 
    BirthDate = "1984-10-21", 
    Sex = "男" 
};

編譯器轉換: 建立暫存變數、呼叫無參數建構函式、逐一指派屬性、指派給目標變數。IL 中可見 stloc.1 暫存、callvirt set_Property 序列。

兩大特性結合效果

指標傳統寫法C# 3.0 寫法
類別定義行數~35 行~10 行
實例化行數6 行1 陳述式
建構函式多載需求高(各種參數組合)低(單一無參數建構函式即可)
IntelliSense 支援完整完整
執行效能基準相同(編譯期轉換)

注意事項與最佳實踐

  • 不可變性:自動屬性預設可讀寫,若需不可變型別,搭配 private set 或 init(C# 9+)
  • 驗證邏輯:需在 setter 中加入驗證時,必須改回手寫屬性
  • 序列化:大多數序列化器支援自動屬性,但部分舊版需 [DataMember] 標記備份欄位
  • 除錯:除錯時無法直接檢視備份欄位名稱,需透過屬性存取
  • 語法糖本質:兩者皆為編譯期語法糖,不改變執行語義,團隊可根據偏好選擇使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved