類別定位:物件導向的基本建構單元
類別是資料 (狀態) 與行為 (方法) 的封裝單位,也是建立物件的藍圖。C# 類別模型建立在 .NET 執行環境之上,支援單一繼承、介面多實作、泛型、屬性/事件/索引子等豐富成員類型。
類別宣告完整語法
[attributes] [class-modifiers] class identifier [type-parameter-list]
[: base-class [, interface-list] ]
{
// class-body: 成員宣告
}
類別修飾詞對照表
| 修飾詞 | 說明 | 備註 |
| new | 巢狀類別隱藏基類別同名成員 | 僅限巢狀類別 |
| public | 無存取限制 | 預設 internal (同組件) |
| internal | 同組件可存取 | 組件預設 |
| private | 僅外層類別可存取 | 巢狀類別專用 |
| protected | 外層類別及衍生類別可存取 | 巢狀類別專用 |
| abstract | 不可實例化,可含 abstract 成員 | 設計基底類別用 |
| sealed | 禁止繼承 | 效能優化、安全性 |
| static | 僅含靜態成員,不可實例化 | C# 2.0+,隱含 sealed |
| partial | 定義分散多檔案 | 原始碼產生器常用 |
類別成員完整分類
| 類別 | 成員類型 | 說明 |
| 資料成員 | 常數 | const 欄位,編譯期值 |
| 欄位 | 變數儲存,static/readonly |
| 事件 | 發布/訂閱通知機制 |
| 函式成員 | 方法 | 執行動作/計算 |
| 屬性 | 封裝存取邏輯 |
| 索引子 | this[] 陣列式存取 |
| 運算子 | 多載符號運算 |
| 建構子 | 實例初始化 |
| 解構子 | 資源清理 (Finalizer) |
| 解構函式 | C# 7.0+ Deconstruct 解構賦值 |
建構子與解構子核心概念
建構子
- 名稱與類別同名,無回傳型別 (連
void 都不可寫)。
- 通常
public,private 用於單例/工廠模式。
- 隱含呼叫
base() (基類別無參數建構子)。
- 不可被繼承,衍生類別必須透過
: base(...) 顯式呼叫。
- 不可在建構子中執行虛擬方法呼叫 (衍生類別尚未初始化)。
解構子
- 語法:
~ClassName(),無參數、無修飾詞、不可多載。
- 非決定性執行:由 GC 在物件無法觸達時排程執行。
- 不應依賴解構子釋放關鍵資源 (檔案鎖、資料庫連線),改用
IDisposable + using。
- C# 無記憶體洩漏問題 (GC 自動管理),解構子僅用於非受控資源最後防線。
類別實例化與繼承宣告
// 實例化
var obj = new MyClass(); // 呼叫建構子
// 單一繼承
class Base { }
class Derived : Base { } // 只能繼承一個基類別
// 介面實作 (多實作)
class Implementer : IFoo, IBar { }
巢狀類別與存取性
public class Outer {
private class Nested { } // 僅 Outer 可存取
protected class ProtectedNested { } // Outer 及其衍生類別可存取
}
現代 C# 類別進階特性
- record 類別 (C# 9):
public record Person(string Name, int Age); — 不可變、值語意相等、with 運算式、解構支援。
- record struct (C# 10):值型別 record。
- required 屬性 (C# 11):
public required string Email { get; set; } — 編譯期強制初始化。
- 檔案區域類型 (C# 11):
file class Helper — 僅限單一檔案可見。