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

全面認識 C#(二):屬性系統深度解析

     編輯:C# 入門

前言

屬性是 C# 最具生產力的特性之一,將「存取器/設定器」模式內建於語言層級,提供比 Java/C++ 更直觀、安全、可維護的資料封裝方式。

語法比較

語言定義使用
Java/C++
private int _size;
public int getSize() { return _size; }
public void setSize(int v) { _size = v; }
foo.setSize(foo.getSize() + 1);
C#
public int Size {
    get => _size;
    set => _size = value;
}
foo.Size++;

屬性優勢深度解析

1. 語法統一性與可讀性

  • 存取與指派使用相同識別碼,符合自然思維模型
  • 消除 getX()/setX() 命名慣例不一致問題
  • IDE 智慧提示直接顯示屬性而非方法對

2. 封裝邏輯集中管理


private string _name;
public string Name {
    get => _name ?? "Unknown";
    set {
        if (string.IsNullOrWhiteSpace(value))
            throw new ArgumentException("Name cannot be empty");
        _name = value.Trim();
    }
}
  • 驗證、轉換、預設值邏輯集中在單一位置
  • 修改邏輯只需改一處,無需同步 getter/setter
  • 註解文件只需寫一次 (///)

3. 存取層級精細控制


public string PublicProp { get; set; }
public string ReadOnlyProp { get; private set; }
public string WriteOnlyProp { private get; set; } // 罕用
internal string InternalSetProp { get; internal set; }
protected string ProtectedProp { get; protected set; }

4. 自動實作屬性 (C# 3.0+)


// 編譯器自動產生隱藏支援欄位
public int Age { get; set; }
public string Name { get; } = "Default"; // 唯讀自動屬性 (C# 6.0+)
public Guid Id { get; } = Guid.NewGuid(); // 初始化運算式

5. 唯讀自動屬性與建構子初始化


public class Person {
    public string Name { get; }
    public DateTime BirthDate { get; }

    public Person(string name, DateTime birthDate) {
        Name = name;
        BirthDate = birthDate;
    }
}

6. 運算式主體成員 (C# 6.0+)


public double Area => Math.PI * Radius * Radius;
public string FullName => $"{FirstName} {LastName}";

進階模式

1. 通知變更 (INotifyPropertyChanged)


public class ViewModel : INotifyPropertyChanged {
    private string _title;
    public string Title {
        get => _title;
        set {
            if (_title != value) {
                _title = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

2. 延遲初始化屬性


private Lazy _resource = new(() => new ExpensiveResource());
public ExpensiveResource Resource => _resource.Value;

3. 索引器屬性


public class Matrix {
    private double[,] _data;
    public double this[int row, int col] {
        get => _data[row, col];
        set => _data[row, col] = value;
    }
}

常見誤區與最佳實務

誤區正確做法
屬性執行複雜/耗時運算屬性應快速完成;複雜運算改用方法 (如 Calculate())
屬性回傳可變集合內部參考回傳唯讀視圖或複本 (AsReadOnly(), ToArray())
過度使用 set 導致不可預期副作用考慮不可變設計,僅在建構子初始化
忽略 value 參數驗證永遠驗證輸入,拋出具體例外 (ArgumentException)

效能考量

  • JIT 編譯器會內聯簡單屬性存取,效能等同欄位存取
  • 避免在屬性 getter 中配置記憶體或執行 I/O
  • 熱路徑程式碼可考慮直接使用欄位 (private int _age;)

總結

C# 屬性系統將封裝模式語言化,提供語法糖、編譯器保證、工具支援三重保障。善用自動屬性、唯讀屬性、運算式主體、存取層級控制,能寫出更清晰、安全、可維護的程式碼。這是 C# 區別於 Java/C++ 的關鍵生產力特性之一。

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