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

C# 屬性完整指南:宣告語法、存取器模式與實戰設計模式

     編輯:關於C#

屬性宣告語法詳解

[attributes] [modifiers] 型別 PropertyName {
    get { /* 讀取邏輯 */ }
    set { /* 寫入邏輯 */ }
}

修飾詞:new, public, protected, internal, private, static, virtual, sealed, override, abstract。static/virtual/override/abstract 四者互斥。

存取器組合與語意

組合語意適用場景
get + set讀寫一般資料屬性
get only唯讀計算屬性、不可變資料
set only唯寫罕見,如 WriteOnlyProperty
get + private set外部唯讀實體識別碼、建構後固定值
get + protected set衍生類別可寫基類別狀態由衍生類別控制

抽象與虛擬屬性

public abstract class Entity {
    public abstract int Id { get; } // 強制實作
    public virtual string DisplayName => GetType().Name; // 可選覆寫
}

public class User : Entity {
    public override int Id { get; } // 必須實作
    public override string DisplayName => $"{FirstName} {LastName}";
}

實戰範例:旅館客戶資料模型

public class Guest {
    public enum Gender { Male, Female, Other }

    // 唯讀屬性:建構子初始化
    public string Name { get; }
    public Gender Sex { get; }

    // 可變屬性:附帶驗證邏輯
    private string _roomNo;
    public string RoomNo {
        get => _roomNo;
        set {
            if (_roomNo == value) return;
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("房號不可為空");
            _roomNo = value;
        }
    }

    private int _stayDays;
    public int StayDays {
        get => _stayDays;
        set {
            if (value < 0) throw new ArgumentOutOfRangeException(nameof(value));
            _stayDays = value;
        }
    }

    public Guest(string name, Gender sex, string roomNo, int stayDays) {
        Name = name; Sex = sex; RoomNo = roomNo; StayDays = stayDays;
    }
}

現代 C# 屬性進階語法

  • 運算式主體:public string FullName => $"{FirstName} {LastName}";
  • init 存取器 (C# 9):public DateTime CreatedAt { get; init; } — 物件初始化器可設定,之後不可變。
  • required 修飾詞 (C# 11):public required string Email { get; set; } — 強制物件初始化器提供值。
  • 屬性模式比對:if (person is { Age: > 18, Name: not null }) ...

效能考量與反模式

  1. 避免在 get 執行複雜計算 → 改用方法 CalculateTotal()。
  2. 避免在 set 執行 IO/非同步操作 → 改用 async Task SetValueAsync()。
  3. 大量唯讀資料 → 考慮 readonly struct + get only 屬性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved