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

C# 欄位與屬性核心差異:資料封裝與存取控制實戰

     編輯:關於C#

欄位 vs 屬性:設計哲學對比

特性欄位屬性
本質直接儲存資料的變數封裝邏輯的存取器組合
封裝性無(直接暴露記憶體位置)完全控制讀寫邏輯、驗證、通知
介面相容性不可定義在介面中可定義在介面中
繼承多態不可 virtual/override支援 virtual/override/abstract
資料繫結不支援完整支援 (WPF/UWP/MAUI/Blazor)
序列化控制困難可自訂忽略/轉換邏輯

欄位宣告要點

[attributes] [field-modifiers] 型別 變數名稱;
修飾詞:new, public, protected, internal, private, static, readonly
  • readonly:只能在宣告或建構子賦值,適合不可變資料。
  • static:屬於類別,所有實例共享單一儲存位置。
  • 預設為 private。

屬性宣告與存取器模式

[attributes] [property-modifiers] 型別 屬性名稱 {
    get { return _backingField; }
    set { _backingField = value; }
}
修飾詞:new, public, protected, internal, private, static, virtual, sealed, override, abstract

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

public string Name { get; set; }           // 讀寫
public int Age { get; private set; }       // 外部唯讀
public Guid Id { get; } = Guid.NewGuid();  // 唯讀,建構子或初始化器賦值

完整屬性模式:驗證與通知

private string _email;
public string Email {
    get => _email;
    set {
        if (_email == value) return;
        if (!value.Contains("@")) throw new ArgumentException("Invalid email");
        _email = value;
        OnPropertyChanged(nameof(Email)); // INotifyPropertyChanged
    }
}

唯讀與寫入限制策略

需求實作方式
完全唯讀get only / init only (C# 9)
內部可寫、外部唯讀public get; private set;
衍生類別可寫、外部唯讀public get; protected set;
建構後不可變init 存取器 (C# 9 record)

最佳實務建議

  1. 公開 API 永遠使用屬性,欄位保持 private。
  2. 簡單資料容器優先用 record (C# 9) 或 struct 配合自動屬性。
  3. 避免在屬性 get 執行昂貴運算(資料庫、IO),改用方法(GetSomething())。
  4. 屬性命名採 PascalCase,布林屬性加 Is/Has/Can 前綴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved