類別本質
類別是建立物件的模板。定義物件可包含的資料(欄位/屬性)與功能(方法/事件),但類別本身不儲存資料。實例化後每個物件擁有獨立資料副本。
類別成員分類
| 成員類型 | 關鍵字/語法 | 用途 |
| 常數 | const | 編譯期固定值,隱含 static |
| 欄位 | public int x; | 儲存實例/靜態資料 |
| 方法 | void Foo() | 執行計算與操作 |
| 屬性 | int Prop { get; set; } | 封裝欄位讀寫,可含邏輯 |
| 事件 | event EventHandler E; | 發佈/訂閱通知機制 |
| 索引器 | this[int i] { get; set; } | 像陣列一樣存取實例 |
| 運算子 | operator +(A,B) | 定義類型專屬運算 |
| 建構函式 | Class() | 初始化實例 |
| 解構函式 | ~Class() | 釋放非託管資源 (罕用) |
存取修飾詞完整對照
| 修飾詞 | 訪問範圍 | 適用目標 |
public | 無限制 | 類別、成員 |
protected | 本類別 + 衍生類別 | 成員 |
internal | 同一組件 | 類別、成員 |
protected internal | 同一組件 OR 衍生類別 | 成員 |
private | 僅本類別 | 成員 |
private protected | 同一組件內的衍生類別 | 成員 (C# 7.2+) |
類別修飾詞
| 修飾詞 | 含義 |
new | 巢狀類別隱藏基類同名成員 |
abstract | 不可實例化,供繼承,可含抽象成員 |
sealed | 不可被繼承 |
static | 僅含靜態成員,不可實例化、不可繼承 |
partial | 跨檔案定義 |
方法修飾詞
| 修飾詞 | 含義 |
virtual | 允許衍生類別 override |
override | 重寫虛擬/抽象方法 |
abstract | 無實作,強制衍生類實作 |
extern | 外部非託管實作 (配合 DllImport) |
static | 屬於類別,非實例 |
靜態 vs 非靜態成員
class Test
{
int x; // 非靜態:屬於實例
static int y; // 靜態:屬於類別
void F() { x = 1; y = 1; } // 實例方法:可存取 x、y
static void G() { /*x = 1;*/ y = 1; } // 靜態方法:不可存取 x (無 this)
static void Main()
{
Test t = new Test();
t.x = 1; // 正確
// t.y = 1; // 錯誤:實例不可存取靜態成員
// Test.x = 1; // 錯誤:類別不可存取非靜態成員
Test.y = 1; // 正確
}
}
繼承存取實戰
class Vehicle
{
public int Wheels;
protected float Weight;
}
class Train
{
private float Weight; // 自有私有欄位
void F()
{
Vehicle v = new Vehicle();
v.Wheels = 4; // OK: public
// v.Weight = 6; // 錯誤: protected 不可從外部存取
Weight = 6; // OK: 存取自有私有欄位
}
}
class Car : Vehicle
{
void F()
{
Vehicle v = new Vehicle();
v.Wheels = 4; // OK: public
v.Weight = 6; // OK: 衍生類可存取基類 protected
}
}
internal 成員特性
同一組件內可見,組件外不可見。常用於組件內部協作類別,避免暴露為公共 API。
總結
掌握類別成員分類、存取修飾詞、靜態/非靜態語義、繼承存取規則,是設計良好封裝、符合開放封閉原則類別架構的基礎。實務上建議:預設 private、按需放寬;欄位永遠 private,對外暴露屬性;慎用 protected,優先考慮組合而非繼承。