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

C# 自動實作屬性完整指南:語法、IL、限制與最佳實務

     編輯:關於C#

語法演進

版本語法說明
C# 3.0public int Age { get; set; }基本自動屬性
C# 6.0public int Age { get; set; } = 18;初始化器
C# 7.0public int Age { get; private set; }存取子不同存取級別
C# 9.0public int Age { get; init; }init 僅建構/初始化器可設定
C# 11public required int Age { get; init; }編譯期強制初始化

編譯器生成的 IL (C# 3.0 基礎版)


.class public auto ansi Employee
{
    .field private int32 '<Age>k__BackingField'
    .field private string '<Name>k__BackingField'

    .property instance int32 Age()
    {
        .get instance int32 Employee::get_Age()
        .set instance void Employee::set_Age(int32)
    }
    .property instance string Name() { ... }

    .method public hidebysig specialname instance int32 get_Age() cil managed
    {
        ldarg.0
        ldfld int32 Employee::'<Age>k__BackingField'
        ret
    }
    .method public hidebysig specialname instance void set_Age(int32 value) cil managed
    {
        ldarg.0
        ldarg.1
        stfld int32 Employee::'<Age>k__BackingField'
        ret
    }
}

關鍵點:編譯器自動產生 **支援欄位** (<PropertyName>k__BackingField) 並標記 [CompilerGenerated]。

限制與注意事項

  • 無法加入邏輯:get/set 內不可包含驗證、通知、延遲載入等程式碼。需邏輯請手寫完整屬性。
  • 無法單獨標記屬性:[Obsolete] 標記在屬性上會同時套用到 get/set;需分別標記存取子 (C# 7.3+ [property: Obsolete])。
  • 無法指定預設值 (C# 6 前):需在建構函式設定或用初始化器。
  • 結構體陷阱:struct 的自動屬性預設值為 0/null,若需非零預設值必須在建構函式明確設定 (結構體無無參建構函式)。
  • 序列化:部分序列化器 (如舊版 XmlSerializer) 僅序列化公用欄位/屬性,自動屬性正常;但 DataContractSerializer 需 [DataMember] 標記支援欄位。

抽象屬性 vs 自動屬性


abstract class Base
{
    public abstract string Name { get; set; } // 必須同時有 get/set,衍生類別實作
}

class Derived : Base
{
    public override string Name { get; set; } // 這裡也是自動屬性
}

最佳實務建議

  1. 預設使用自動屬性:減少樣板碼,提升可讀性。
  2. 單向不可變:get; private set; 或 get; init; 表達「建構後不變」語意。
  3. 必要初始化:C# 11 required 關鍵字編譯期強制呼叫端提供值。
  4. 需要邏輯時手寫:驗證、INotifyPropertyChanged、延遲初始化、相依屬性計算等。
  5. 記錄型別優先:C# 9+ record 提供完整不可變、值相等、with-expression、解構,替代大部分 DTO/實體類別。

總結

自動實作屬性是 C# 最成功的語法糖之一,編譯器透明生成支援欄位與存取子,IL 層面與手寫屬性無異。理解其生成機制、限制與現代擴充 (init, required, record),能寫出更簡潔、語意更精確的程式碼。

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