[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;
}
}
public string FullName => $"{FirstName} {LastName}";public DateTime CreatedAt { get; init; } — 物件初始化器可設定,之後不可變。public required string Email { get; set; } — 強制物件初始化器提供值。if (person is { Age: > 18, Name: not null }) ...get 執行複雜計算 → 改用方法 CalculateTotal()。set 執行 IO/非同步操作 → 改用 async Task SetValueAsync()。readonly struct + get only 屬性。