base 與 this 是 C# 物件導向機制中最核心的存取關鍵字,雖然語法簡單,但其在繼承鏈、建構函式鏈結、多型實現中的行為細節,往往是面試與實戰中的高頻考點。本文透過完整範例、IL 反編譯與實例化順序分析,徹底釐清兩者的邊界與最佳實踐。
| 關鍵字 | 核心用途 | 允許使用位置 |
|---|---|---|
base |
存取基類被覆寫的成員、指定基類建構函式 | 建構函式、實例方法、屬性存取子 |
this |
參考目前實例、消除名稱遮蔽、傳遞自身參數、宣告索引子 | 實例成員內部(不可用於 static 成員) |
public class Vehicle { ... } // 基類
public class Car : Vehicle { ... } // 中間層
public class Audi : Car { ... } // 最底層派生類
範例涵蓋:
this 在建構函式鏈結 (: this())、消除參數遮蔽、傳遞自身 (Action.ToRun(this))、索引子宣告base 指定基類建構函式 (: base(...))、呼叫被覆寫方法 (base.ShowResult())、存取基類非覆寫方法 (base.Run())base.Method() 指向直接父類的實作(如 Audi.base.ShowResult() → Car.ShowResult())base.Method() 可向上尋找任意祖先類別的實作(如 Audi.base.Run() → Vehicle.Run())IL 驗證(Audi.ShowResult):
IL_0002: call instance void Car::ShowResult() // base.ShowResult()
IL_0009: call instance void Vehicle::Run() // base.Run() 無覆寫時向上尋找
物件實例化總是從 System.Object 開始,依序向下:
System.Object.Object()Vehicle.Vehicle(string, int)Car.Car()Car.Car(string, int)Audi.Audi()Audi.Audi(string, int)base 與 this 在建構函式中互斥,只能二擇一指定單一建構函式。
static 方法屬於類別而非實例,因此絕不可在靜態方法中使用 this 或 base。
thisbase 只能存取 public/protected 成員,private 不可見this 可存取本類別所有成員(含繼承而來的 public/protected),不受存取層級限制((BaseClass)this).Method() 亦可存取基類成員(非 static)透過 IL 層面的觀察與實例化順序的推演,我們不僅知道「怎麼用」,更理解「為什麼這樣運作」。這正是從語法使用者進階為框架思維者的關鍵一步。