這 25 題涵蓋 C# 核心語法、記憶體模型、型別系統、執行機制。每題附帶標準答案、程式碼驗證與深度解析,適合面試準備與知識查漏補缺。
差異:靜態屬於型別 (類別),非靜態屬於實例 (物件)。靜態在類別載入時建立,透過類別名存取;非靜態在實例化時建立,透過實例存取。靜態方法內不可直接使用非靜態成員。
class Demo { public static string S = "C"; public string I = "O"; }
Demo.S = "C#"; // 靜態
var d = new Demo(); d.I = "Obj"; // 非靜態
| 特性 | const | static readonly |
|---|---|---|
| 初始化時機 | 編譯期 | 執行期 (型別建構函式) |
| 值儲存 | 嵌入呼叫端 IL | 儲存於定義組件 |
| 修飾對象 | 值型別、string | 任何型別 |
| 版本相容 | 修改需重編譯呼叫端 | 僅重編譯定義組件即可 |
聲明由外部實現的方法 (如 P/Invoke 呼叫 Win32 API),常搭配 [DllImport] 與 static 使用。不可與 abstract 共用。
修飾類別/方法/屬性/事件/索引子,表示無實作 (抽象成員) 或不可實例化 (抽象類別)。不可與 static、virtual 共用。強制衍生類實作契約。
限定存取範圍為同一組件內。internal protected 為「同一組件 或 衍生類」 (邏輯 OR),非 AND。
override 禁止進一步覆寫。override:覆寫基類虛擬成員 (多型)。overload:同類別內同名不同參數簽章 (靜態綁定)。讓物件像陣列一樣用 obj[index] 存取。本質是帶參數的屬性,參數型別不限於 int。
隱藏基類同名成員 (非覆寫)。僅用於衍生類。不可與 override 共用。修補基類設計缺失時使用。
this(...))。this.field = field)。public int this[int i]。可。需加 new abstract (隱藏) 或 override abstract (抽象覆寫,強制再衍生類實作)。
繼承而來的虛擬方法會隱性變為非虛擬;但密封類不能新增虛擬方法。
get/set 封裝欄位讀寫,實現封裝性。屬性不一定對應欄位 (可計算、驗證、事件觸發)。
不可與 virtual 共用;可與 override 共用 (抽象覆寫)。
方法、屬性、索引子、事件。不可包含:欄位、常數、建構函式、解構函式、運算子、靜態成員 (C# 8 前)。
| 特性 | 類別 | 結構 |
|---|---|---|
| 型別分類 | 參考型別 (堆疊) | 值型別 (堆疊/內嵌) |
| 指派行為 | 複製參考 | 複製值 (新實例) |
| 繼承 | 支援 | 不可繼承類別/結構,可實作介面 |
| 建構/解構 | 皆有 | 無預設無參建構函式,無解構函式 |
| 適用場景 | 複雜物件、身分識別、大型資料 | 輕量資料結構 (座標、矩形、日期) |
同名成員產生二義性。解決:顯式實作 (InterfaceName.Member)。
using Alias = Namespace.Type; 解決同名類型衝突或簡化冗長命名空間。作用域為檔案頂層或命名空間內部。
實作 IDisposable 模式:Dispose(bool) + 解構函式 + GC.SuppressFinalize。適用非受控資源 (COM、Handle) 或大量實例需決定性釋放。
受控與非受控代碼互操作 (平台調用服務)。透過 System.Runtime.InteropServices。每次轉換約 10-40 指令開銷,建議粗粒度調用 (一次調用多做事)。
String:不可變,運算產生新實例,堆疊配置。StringBuilder:可變緩衝區,大量拼接/修改效能極佳。==) 比較值 而非參考。implicit:隱式轉換 (無資料遺失,如 int → long)。explicit:顯式轉換 (可能遺失精度/範圍,需強制轉型 (T)x)。方法參數陣列化,允許可變數量引數。只能出現一次且必須是最後一個參數。型別通常為 object[] 或具體型別陣列。
執行時期檢查/操作中繼資料 (組件、模組、型別、成員)。支援動態建立實例、呼叫方法、存取屬性/欄位。核心命名空間 System.Reflection。應用:外掛架構、序列化、ORM、動態代理、測試框架。效能成本高,熱路徑慎用或快取 MethodInfo。
這 25 題串聯起 C# 的型別系統、記憶體管理、多型機制、元件模型與執行時互操作。深入理解每題背後的 設計動機 與 執行機制,比背誦答案更有價值。