成員來源雙軌制
| 來源 | 說明 |
| 宣告成員 | 類別本身定義的成員 |
| 繼承成員 | 從基類別繼承而來 (非 private) |
成員類型完整分類
| 大類 | 成員類型 | 關鍵字/語法 | 說明 |
| 資料成員 | 常數 | const | 編譯期常值,隱含 static |
| 欄位 | field | 變數儲存,支援 static/readonly |
| 事件 | event | 發布/訂閱通知 |
| 函式成員 | 方法 | method | 執行計算/動作 |
| 屬性 | property | 封裝 get/set 邏輯 |
| 索引子 | this[] | 陣列式存取介面 |
| 運算子 | operator | 多載符號運算 |
| 建構子 | ctor | 實例初始化 |
| 解構子 | ~Class() | 非受控資源最終化 |
| 解構函式 | Deconstruct | C# 7.0+ 元組解構支援 |
存取修飾詞五層級
| 修飾詞 | 可存取範圍 | 適用對象 |
| public | 任何地方 | 所有成員 |
| protected | 類別內部 + 衍生類別 | 所有成員 |
| internal | 同一組件內部 | 所有成員 |
| protected internal | 同一組件 或 衍生類別 (跨組件) | 所有成員 |
| private | 僅類別內部 | 所有成員 (預設) |
| private protected | 同一組件內的衍生類別 | C# 7.2+,所有成員 |
this 關鍵字四大使用場景
| 場景 | this 型別 | 說明 |
| 類別建構子 | 值型別 (參考) | 指向正在建構的實例 |
| 類別方法/屬性/索引子 | 值型別 (參考) | 指向呼叫該成員的實例 |
| 結構體建構子 | 變數型別 (by-ref) | 指向正在建構的結構體變數 |
| 結構體方法 | 變數型別 (by-ref) | 指向呼叫該方法的結構體變數 |
this 為唯讀,不可指派 (this = ... 錯誤)、不可 ++/--。
- 可作為回傳值:
return this; (流暢介面模式)。
- C++ 程式員注意:無
this->、::,統一用 . 存取成員。
靜態 vs 非靜態成員核心差異
class Demo {
int _instanceField = 1;
static int _staticField = 2;
void InstanceMethod() {
_instanceField = 10; // OK
_staticField = 20; // OK
}
static void StaticMethod() {
_staticField = 20; // OK
// _instanceField = 10; // CS0120: 需要物件參考
}
}
- 靜態成員屬於類別,單一儲存位置,所有實例共享。
- 非靜態成員屬於實例,每個實例獨立副本。
- 實例成員可透過
this 隱含存取;靜態成員不可用 this。
成員常數:const 欄位規範
class MathConstants {
public const double PI = 3.141592653589793;
public const double E = 2.718281828459045;
// 可合併宣告
public const int MaxRetries = 3, DefaultTimeout = 5000;
}
- 修飾詞:
new, public, protected, internal, private (無 static,隱含 static)。
- 型別限制:內建值型別 +
string + null 參考。
- 必須在宣告時初始化,值為編譯期常數運算式。
- 跨組件使用時:值內嵌至呼叫端 IL,修改值需重新編譯消費者。
成員存取實戰範例:Vehicle/Train/Car
class Vehicle {
public int Wheels;
protected float Weight;
void InternalMethod() {
Wheels = 4; // OK: 存取自身 public
Weight = 10; // OK: 存取自身 protected
}
}
class Train {
public int Carriages;
private int Passengers;
private float Weight; // 隱藏 Vehicle.Weight (無關)
void Test(Vehicle v) {
v.Wheels = 4; // OK: public
// v.Weight = 6; // CS0122: protected 外部不可存取
Weight = 6; // OK: 自身 private
}
}
class Car : Vehicle {
void Test(Vehicle v) {
v.Wheels = 4; // OK: public
v.Weight = 6; // OK: protected 衍生類別可存取基類別 protected
}
}