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

C# 類別屬性深度解析:存取子、唯讀、寫入與完整範例

     編輯:關於C語言

前言

在 C# 中,屬性 是封裝類別內部資料的核心機制。相較於直接公開欄位,屬性透過 get(讀取)與 set(寫入)存取子,提供資料驗證、延遲計算、事件通知等彈性。本文詳細說明三種屬性模式(唯讀、唯寫、讀寫)的語法與實務應用,並附上完整可執行範例。

屬性的三種存取模式

模式關鍵字組合適用情境
唯讀get only計算屬性、常數、不可變物件狀態
唯寫set only密碼設定、單向資料流、注入相依性
讀寫get / set一般資料封裝、雙向綁定

完整程式碼範例

using System;

public class DemoClass
{
    // 私有備份欄位
    private int _writeOnlyField;
    private readonly int _readOnlyField = 100;
    private int _readWriteField;

    // 唯寫屬性:僅提供 set 存取子
    public int WriteOnlyProperty
    {
        set { _writeOnlyField = value; }
    }

    // 唯讀屬性:僅提供 get 存取子
    public int ReadOnlyProperty
    {
        get { return _readOnlyField; }
    }

    // 讀寫屬性:同時提供 get 與 set
    public int ReadWriteProperty
    {
        get { return _readWriteField; }
        set { _readWriteField = value; }
    }
}

class Program
{
    static void Main()
    {
        DemoClass obj = new DemoClass();

        // 唯讀:只能取值
        int val = obj.ReadOnlyProperty;   // 100
        Console.WriteLine($"ReadOnly: {val}");

        // 唯寫:只能指派
        obj.WriteOnlyProperty = 250;
        // 無法讀取 obj.WriteOnlyProperty → 編譯錯誤

        // 讀寫:可讀可寫
        obj.ReadWriteProperty += 10_000_000;
        Console.WriteLine($"ReadWrite: {obj.ReadWriteProperty}"); // 10000000
    }
}

關鍵觀念解析

1. value 關鍵字

在 set 區塊中,value 代表呼叫端指派的值,型別與屬性宣告一致。可在其中加入驗證邏輯:

public int Age
{
    set
    {
        if (value < 0 || value > 150)
            throw new ArgumentOutOfRangeException(nameof(value), "年齡需在 0~150 之間");
        _age = value;
    }
}

2. 唯讀屬性的兩種寫法

// 傳統寫法:唯讀欄位 + get 存取子
private readonly int _id = 42;
public int Id { get { return _id; } }

// C# 6+ 唯讀自動實作屬性(編譯器自動產生 readonly backing field)
public int Id { get; } = 42;

// 建構子指派(C# 6+)
public int Id { get; }
public DemoClass(int id) => Id = id;

3. 唯寫屬性實務用途

  • 密碼/金鑰設定:public string Password { set => _hashed = Hash(value); }
  • 相依性注入:public ILogger Logger { set => _logger = value; }
  • 事件訂閱代理:public Action OnSave { set => _saveHandler += value; }

4. 表達式主體簡寫

// C# 6+ 簡潔語法
public int ReadOnly => _readOnlyField;
public int ReadWrite { get => _field; set => _field = value; }

進階:屬性存取權限非對稱

C# 允許 get 與 set 設定不同存取層級:

public int InternalId { get; private set; }   // 外部可讀,內部可寫
public int ProtectedData { get; protected set; } // 衍生類別可寫

最佳實務建議

  • 優先使用自動實作屬性(public int Prop { get; set; }),需要邏輯時再展開完整寫法。
  • 資料驗證放在 set 中,拋出具體例外而非靜默忽略。
  • 避免在 get 中執行耗時運算(如資料庫查詢、檔案 I/O),改用方法命名(GetData())表達語意。
  • 不可變型別:所有屬性皆為 get only,透過建構子初始化,利於執行緒安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved