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

.NET 屬性 深度解析:從封裝原理到自動實作屬性與語法糖本質

     編輯:ASP.NET 基礎

什麼是屬性?

屬性是對欄位的封裝。將欄位設為 private,透過 public 的 get/set 存取器控制讀寫權限、驗證邏輯、延遲載入等,實現資料隱藏與封裝。

兩種定義方式

1. 傳統完整寫法

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value; }
}
  • 可在 get/set 加入邏輯(驗證、日誌、快取)。
  • 可分別設定存取修飾詞:public string Name { get; private set; }。
  • Visual Studio 快捷鍵:欄位上 Ctrl+R, Ctrl+E 自動產生屬性。

2. 自動實作屬性

public string Name { get; set; }
  • C# 3.0+ 引入,編譯器自動產生隱藏後端欄位(名稱如 <Name>k__BackingField)。
  • 簡潔、預設無邏輯,適合單純資料傳遞物件(DTO、Entity)。
  • 注意:二進位序列化時,隱藏欄位名稱可能跨版本不穩定,建議搭配 [DataMember] 或改用完整寫法。

屬性的本質:語法糖

透過 IL 反編譯工具(ILSpy、dnSpy)可見,屬性編譯後變成兩個方法:

// get_Name
public string get_Name() { return this._name; }

// set_Name
public void set_Name(string value) { this._name = value; }
  • Java 習慣寫 getName()/setName() 方法,.NET 用屬性語法糖簡化呼叫:obj.Name vs obj.get_Name()。
  • get/set 本質上是 specialname 標記的方法,CLR 支援直接呼叫。

進階用法

1. 唯讀屬性

// 僅建構子可設定
public string Id { get; } = Guid.NewGuid().ToString();

// C# 6+ 唯讀自動屬性
public DateTime CreatedAt { get; } = DateTime.Now;

2. 運算式主體成員

public string FullName => $"{FirstName} {LastName}"; // 唯讀
public bool IsAdult => Age >= 18;

3. 屬性驗證

private int _age;
public int Age
{
    get => _age;
    set
    {
        if (value < 0 || value > 150) throw new ArgumentOutOfRangeException(nameof(Age));
        _age = value;
    }
}

4. 延遲載入

private List _orders;
public List Orders
{
    get
    {
        if (_orders == null) _orders = OrderService.GetByUserId(this.Id);
        return _orders;
    }
}

最佳實務建議

  1. 預設用自動屬性:簡潔、可讀,需要邏輯再改完整寫法。
  2. 不可變類型:盡量用 get; 配合建構子注入,減少可變狀態。
  3. 避免在 get 做重運算:若必須,請快取或改為方法 GetOrders() 明確語意。
  4. 公開介面用屬性,內部邏輯用方法:屬性給外部呼叫,內部複雜操作用方法名稱表達意圖。

總結

.NET 屬性是「欄位封裝」的語法糖,編譯為 get_X/set_X 方法。自動實作屬性讓程式碼更精簡,但需注意序列化與效能陷阱。善用唯讀、運算式主體、驗證邏輯,能寫出更安全、可維護的程式碼。

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