首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

[你必須知道的.NET] 第六回:深入淺出關鍵字——base 與 this 實戰解析

     編輯:關於.NET

base 與 this 是 C# 物件導向機制中最核心的存取關鍵字,雖然語法簡單,但其在繼承鏈、建構函式鏈結、多型實現中的行為細節,往往是面試與實戰中的高頻考點。本文透過完整範例、IL 反編譯與實例化順序分析,徹底釐清兩者的邊界與最佳實踐。

1. 核心功能速覽

關鍵字核心用途允許使用位置
base 存取基類被覆寫的成員、指定基類建構函式 建構函式、實例方法、屬性存取子
this 參考目前實例、消除名稱遮蔽、傳遞自身參數、宣告索引子 實例成員內部(不可用於 static 成員)

2. 綜合範例:三層繼承鏈實戰

public class Vehicle { ... }           // 基類
public class Car : Vehicle { ... }     // 中間層
public class Audi : Car { ... }        // 最底層派生類

範例涵蓋:

  • this 在建構函式鏈結 (: this())、消除參數遮蔽、傳遞自身 (Action.ToRun(this))、索引子宣告
  • base 指定基類建構函式 (: base(...))、呼叫被覆寫方法 (base.ShowResult())、存取基類非覆寫方法 (base.Run())

3. 關鍵行為深度剖析

3.1 多層繼承下的 base 導向規則

  • 有覆寫存在: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() 無覆寫時向上尋找

3.2 實例化順序與建構函式鏈結

物件實例化總是從 System.Object 開始,依序向下:

  1. System.Object.Object()
  2. Vehicle.Vehicle(string, int)
  3. Car.Car()
  4. Car.Car(string, int)
  5. Audi.Audi()
  6. Audi.Audi(string, int)

base 與 this 在建構函式中互斥,只能二擇一指定單一建構函式。

3.3 靜態成員禁用規則

static 方法屬於類別而非實例,因此絕不可在靜態方法中使用 this 或 base。

4. 最佳實踐與通用規則

  • 除非必要(解決名稱衝突、建構函式鏈結),盡量少用或不用base/this
  • base 只能存取 public/protected 成員,private 不可見
  • this 可存取本類別所有成員(含繼承而來的 public/protected),不受存取層級限制
  • 替代方案:顯式轉型 ((BaseClass)this).Method() 亦可存取基類成員(非 static)

5. 結語

透過 IL 層面的觀察與實例化順序的推演,我們不僅知道「怎麼用」,更理解「為什麼這樣運作」。這正是從語法使用者進階為框架思維者的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved